2016-11-24 11 views
0

MATLABでは、「セレクタ行列」が与えられた複数の行列から選択することで、効率的な(および/またはベクトル化された)行列の埋め込み方法を探しています。例えば、等3つのソース行列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] 

IはM3から2番目、M1から最初のエントリを選択することによって、新たな行列M = [0.1, 20; 0.3, 4]を生成するのマトリックス、

を与え

私は間違いなく、ネストされたループでそれを行うことができます、各エントリを通過し、値を入力しますが、より効率的な方法があると確信しています。


M1M2M3Mすべての3D行列(RGB画像)がありますか? Iの各エントリは、どの行列から3ベクトルを取るべきかを示しています。もしI(1, 3) = 3なら、(1, 3, :)のインデックスがMのエントリーはM3(1, 3, :)であるはずです。

答えて

0

これを行う方法は、変数の格納方法を変更することなく、マスクを使用することです。少数の行列があれば、forループを避けて仕事をしています。あなたは、猫機能や細胞を使わずに、完全にベクター化することはできません。

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

これを行う1つの方法は、あなたの画像で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

私はこれにアプローチする最善の方法は、次元を積み重ねることです(すなわち、あなたの個々の行列の値である行列を持つことです)。残念ながら、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次元の場合)場合は、高次元のコードを拡張する必要があります。

関連する問題