2016-11-24 96 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维情况),您将不得不扩展代码以获得更高维度。