在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
。
我绝对可以在嵌套循环中执行此操作,遍历每个条目并填写值,但我确信有更有效的方法。
如果M1
,M2
,M3
和M
都是3D矩阵(RGB图像),该怎么办? I
的每个条目告诉我们从哪个矩阵我们应该采用3向量。比方说,如果I(1, 3) = 3
,那么我们知道由(1, 3, :)
M
索引的条目应为M3(1, 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);