2014-10-30 1 views
3

각 요소에 벡터를 액세스하는 데 필요한 다양한 좌표가 포함 된 셀 목록이 있습니다. 예를 들어,셀 및 벡터 작업을 처리하는 더 빠른 방법을 찾고

C ={ [1 2 3] , [4 5], [6], [1 8 9 12 20]} 

이것은, 실제 경우에, C는 각각의 요소 (1) (1000) 요소의 벡터를 포함, 10^4 ~ 10^6 크기의 단지 일례이다. 각 요소를 좌표로 사용하여 벡터의 해당 요소에 액세스해야합니다. 여기 X는 10000 개 요소의 큰 벡터는 셀 요소

for n=1:size(C,1) 
    x = mean(X(C{n})); 
    % put x to somewhere 
end 

에 의해 지정된 벡터 요소의 평균 값을 찾기 위해 루프를 사용하고 있습니다. 루프를 사용하는 것은 괜찮지 만 루프를 사용하지 않고 같은 일을하는 방법이 있는지 궁금합니다. 내가 위의 코드를 요구하는 이유는 여러 번 실행해야하고 lopp를 사용하는 것은 꽤 느리다.

+0

는 인덱스를 의미합니까? 그리고 그것은 C의 각 셀에 대해'x (n) '이되어서는 안됩니까? 그리고 아마도 루프는 -'n = 1 : size (C, 2)'일 수도 있습니다. 'n = 1 : numel (C)'가 더 좋을지도 모릅니다. – Divakar

+0

또한 내가 물어 보도록 - 얼마나 큰 C에서 가장 큰 세포가 될 수 있을까? 예를 들어, 여기에 주어진 샘플에서, 그것은 마지막 셀에있는'5'입니다. – Divakar

+0

코드를 프로파일 링하고 실제 병목 현상이 무엇인지 확인하는 것이 좋습니다. – bdecaf

답변

0

접근법 # 1

C_num = char(C{:})-0; %// 2D numeric array from C with cells of lesser elements 
      %// being filled with 32, which is the ascii equivalent of space 

mask = C_num==32; %// get mask for the spaces 
C_num(mask)=1; %// replace the numbers in those spaces with ones, so that we 
       %// can index into x witout throwing any out-of-extent error 

X_array = X(C_num); %// 2D array obtained after indexing into X with C_num 
X_array(mask) = nan; %// set the earlier invalid space indices with nans 
x = nanmean(X_array,2); %// final output of mean values neglecting the nans 

접근법 # 2

lens = cellfun('length',C); %// Lengths of each cell in C 
maxlens = max(lens); %// max of those lengths 

%// Create a mask array with no. of rows as maxlens and columns as no. of cells. 
%// In each column, we would put numbers from each cell starting from top until 
%// the number of elements in that cell. The ones(true) in this mask would be the 
%// ones where those numbers are to be put and zeros(false) otherwise. 
mask = bsxfun(@le,[1:maxlens]',lens) ; %//' 

C_num = ones(maxlens,numel(lens)); %// An array where the numbers from C are to be put 

C_num(mask) = [C{:}]; %// Put those numbers from C in C_num. 
    %// NOTE: For performance you can also try out: double(sprintf('%s',C{:})) 
X_array = X(C_num); %// Get the corresponding X elements 
X_array(mask==0) = nan; %// Set the invalid locations to be NaNs 
x = nanmean(X_array); %// Get the desired output of mean values for each cell 

접근법 # 3

,617,

이 방법은 접근법 2와 거의 같지만 끝 부분에 변경된 내용이 있으므로 nanmean을 피해야합니다.

따라서, 이들에 접근 # 2에서 마지막 두 행을 편집 - 좌표로

X_array(mask1==0) = 0; 
x = sum(X_array)./lens; 
+0

접근법 # 3에서는 'mask1'이 아니라 'mask'입니다. – Divakar