在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]中选择第一个条目、从M3中选择第二个条目来生成一个新的矩阵M3。
我肯定可以在嵌套循环中完成,遍历每个条目并填充值,但我确信有一种更有效的方法。
如果M1、M2、M3和M都是3D矩阵(RGB图像)怎么办?I的每个条目都告诉我们应该从哪个矩阵中取一个3向量。比如说,如果是I(1, 3) = 3,那么我们知道由(1, 3, :) of M索引的条目应该是M3(1, 3, :)。
发布于 2016-11-25 14:56:16
一种不改变变量存储方式的方法是使用掩码。如果您有几个矩阵,它就是在做避免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);发布于 2016-11-24 23:07:32
这样做的一种方法是用你的图像生成一个四维矩阵。它有增加内存的成本,或者至少改变你的内存方案。
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);我还没有对它进行正确的测试,但它应该能用。
发布于 2016-11-24 23:11:34
我认为处理这个问题的最好方法是堆叠维度(即有一个矩阵,其值是每个缩进矩阵的值)。不幸的是,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)))对于更复杂的(三维情况),您必须将代码扩展到更高的维度。
https://stackoverflow.com/questions/40795254
复制相似问题