2015-07-12 57 views
0

我是matlab新手,所以我在查找執行此任務的最有效方法時遇到了一些問題。使用二元映射過濾多維數組(邏輯索引效率低下)

我試圖利用第二矩陣N.濾除一個矩陣M

M = AxBxCxD其中A,B,C,d爲〜150中的每個 N = AxBxC的數量級上。同上A,B,C。它的條目是二進制的。

我希望過濾矩陣M,以便它只包含數據,其中在N矩陣條目是1。另外,我希望它是一個二維陣列,其中SXD S是在N-

是1的元素數

我曾嘗試兩種方法到目前爲止,這兩者要麼太內存密集型或慢​​:

1)

indx = find(N(:)); 
[X,Y,Z] = ind2sub(size(M),indx); 
result = squeeze(M(X,Y,Z,:)); 

在第三時間,M(X,Y,Z的結果,: )是記憶力強大的方式。

2)

l = logical(N) ; 
map = repmat(l,'length of D dimension'); 
M(map); 
%Reduce dimension next 

但計算的時間來建立repmat(1,280)是相當大的。

有沒有更有效的方法來計算這個結果。也許在M中沿着D維的每一行應用蒙版(我看着這個,但無法計算出任何東西)。

回答

1

你可以用邏輯索引來做到這一點。我認爲這是正確的尺寸,但我總是很難思考4D。

N = (rand(5, 7, 10) < 0.5); 
M = rand(size(N,1), size(N,2), size(N,3), 3); 

%Use reshape to go from a AxBxCxD array to an A*B*C x D matrix 
m = reshape(M, numel(N), []); 
M2 = m(N(:), :); 
+0

這是完美的!非常感謝! –