2014-03-07 56 views
3

我想索引的一部分矩陣使用邏輯掩碼。因此,作爲一個輸入,我有一個矩陣A,其中有一些nan值,我創建一個mask爲此使用isnan。此外,我有一個矢量v的值,我想插入到A A(mask)=v。然後我使用A B=[A;A;A]構造另一個矩陣B.現在我想將v中的值應用於B中的正確位置。如何在Matlab中創建temp=B(1:size(A,1),1:size(A,2))矩陣或創建新的mask=[mask;false(2*size(A,1),size(A,2))]矩陣塊索引加蒙版在matlab中

再來一次:

A = rand(2,10); 
v = A(A>0.5); 
A(A>0.5) = nan; 
mask = isnan(A); 
B=[A;A;A]; 

% now how to write v to B? 
% not doing one of those: 

tmp = B(1:2,:); 
tmp(mask) = v; 
B(1:2,:) = tmp; 

%... 

mask1 = [mask;false(4,10)] 

mask2 = [false(2,10);mask;false(2,10)] 

mask3 = [false(4,10);mask] 

B(mask1) = v; 
B(mask2) = v; 
B(mask3) = v; 

% what i miss is something like B(1:2,:)(mask) 

回答

1

我假設你想在B內的三次出現A處填充值。

如果你不介意重複矢量v

B = repmat(A.',1,3); % easier to work by columns 
B(bsxfun(@plus,find(mask.'),(0:2)*numel(A))) = v(repmat(1:numel(v),1,3)); % fill 
B = B.'; % transpose back 
+0

謝謝你,你的回答有助於解決我的問題,或者至少它給了我一個很好的發展方向。我的問題是性能。 'B'是一個大矩陣,寫入操作'B(掩碼)= v'經常進行。而且'B'就是這樣的類似'B = [A(:,4:end); A(:,3:end-1); A(:,2:end-2)]''。 – Dimitri

0

不知道如果我正確地理解你的措辭,但如果你把這些線底:

mask2 = repmat(mask, 3, 1); 
B(mask2) = NaN 

它會重複NaN的垂直值3倍。這取決於你的意思是'將v中的值應用到B中的正確位置'

+0

謝謝你,但它解決了沒有什麼,我試圖問。 – Dimitri