2016-11-24 95 views
0

在MATLAB中,我正在尋找一種通過從給定「選擇器矩陣」的多個矩陣中進行選擇來填充矩陣的高效(和/或矢量化)方法。例如,給定三個源矩陣在MATLAB中用索引矩陣選擇值?

M1 = [0.1, 0.2; 0.3, 0.4] 
M2 = [1, 2; 3, 4] 
M3 = [10, 20; 30, 40] 

和指數

I = [1, 3; 1, 2] 

我想通過從M3選擇從M1的第一個條目,第二以產生新的矩陣M = [0.1, 20; 0.3, 4]的矩陣等

我完全可以在嵌套循環中做到這一點,通過每個條目並填寫值,但我相信有一種更有效的方法。


如果M1M2M3M都是3D矩陣(RGB圖像)? I的每個條目告訴我們從哪個矩陣中我們應該採用3向量。說,如果I(1, 3) = 3,那麼我們知道M(1, 3, :)索引的條目應該是M3(1, 3, :)

回答

0

在不改變存儲變量的方式的情況下這樣做的一種方法是使用蒙版。如果你有幾個矩陣,它正在做避免for循環的工作。如果不經過cat函數或使用單元格,將無法完全進行矢量化。

M = zeros(size(M1)); 

Itmp = repmat(I==1,[1 1 size(M1,3)]); M(Itmp) = M1(Itmp); 
Itmp = repmat(I==2,[1 1 size(M1,3)]); M(Itmp) = M2(Itmp); 
Itmp = repmat(I==3,[1 1 size(M1,3)]); M(Itmp) = M3(Itmp); 
0

這樣做的一種方法可能是與您的圖像生成4D矩陣。它具有增加內存量的成本,或者至少改變了你的內存方案。

Mcat = cat(4, M1, M2, M3); 

然後你可以使用該功能sub2ind得到一個量化矩陣構建。

% get the index for the basic Image matrix 
I = repmat(I,[1 1 3]); % repeat the index for for RGB images 
Itmp = sub2ind(size(I),reshape(1:numel(I),size(I))); 

% update so that indices reach the I(x) value element on the 4th dim of Mcat. 
Itmp = Itmp + (I-1)*numel(I); 

% get the matrix 
M = Mcat(Itmp); 

我沒有正確測試它,但它應該工作。

0

我認爲最好的方法來解決這個問題是堆棧維度(即有一個矩陣的值是每個indvidiual matricies)。不幸的是,MATLAB並不真正支持數組索引,所以最終發生的是最終使用線性索引來通過subs2ind命令轉換您的值。我相信你可以使用下面的代碼。

M1 = [0.1, 0.2; 0.3, 0.4] 
M2 = [1, 2; 3, 4] 
M3 = [10, 20; 30, 40] 



metamatrix=cat(3,M1,M2,M3) 
%Create a 3 dimenssional or however many dimension matrix by concatenating 
%lower order matricies 

I=[1,1,1;1,2,3;2,1,1;2,2,2] 

M=reshape(metamatrix(sub2ind(size(metamatrix),I(:,1),I(:,2),I(:,3))),size(metamatrix(:,:,1))) 

對於更復雜的(3維情況),您將不得不擴展代碼以獲得更高維度。