在MATLAB中用索引矩阵选择值?

时间:2016-11-24 22:24:41

标签: 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]

我想通过选择M = [0.1, 20; 0.3, 4]中的第一个条目,M1中的第二个条目等来生成新矩阵M3

我绝对可以在嵌套循环中执行此操作,遍历每个条目并填写值,但我确信有更有效的方法。

如果M1M2M3M都是3D矩阵(RGB图像),该怎么办? I的每个条目告诉我们从哪个矩阵我们应该采用3向量。比方说,如果I(1, 3) = 3,那么我们知道由(1, 3, :) M索引的条目应为M3(1, 3, :)

3 个答案:

答案 0 :(得分:0)

这样做的一种方法是使用图像生成4D矩阵。它有增加内存量的成本,或至少改变你的内存方案。

Competition

然后,您可以使用函数Mcat = cat(4, M1, M2, M3); 来创建矢量化矩阵。

sub2ind

我没有正确测试它,但它应该可以工作。

答案 1 :(得分: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维案例),您必须扩展更高维度的代码。

答案 2 :(得分: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);