如何使用矢量化代码有效地获得3D矩阵或单元阵列?

时间:2015-07-03 08:56:08

标签: matlab matrix multidimensional-array vectorization cell-array

这就是我想要的,一个三维矩阵:

K = 2:2.5:10;
den = zeros(1,4,4);
for i = 1:1:4
    den(:,:,i) = [1, 5, K(i)-6, K(i)];
end

或者,也可以接受单元格数组:

K = 2:2.5:10;
for i = 1:1:4
    den{i} = [1, 5, K(i)-6, K(i)];
end

但我想知道是否有更有效的方法使用矢量化代码来执行此操作,例如:

K = 2:2.5:10;
den = [1, 5, K-6, K];

我知道最后一段代码不会得到我想要的东西。但是,就像我可以使用:

v = [1 2 3];
v2 = v.^2;

而不是:

v = [1 2 3];
for i = 1:length(v)
    v(i) = v(i)^2;
end

获取我想要的矩阵。是否有类似的方法这样做,以便我可以更有效地获得我在开头提到的3-D矩阵或单元阵列?

3 个答案:

答案 0 :(得分:1)

您需要在列中“广播”标量值,使它们与K向量的长度相同。 MATLAB不会自动进行广播,因此您需要重复标量并创建适当大小的向量。您可以使用repmat()

K = 2:2.5:10;
%% // transpose K to a column vector:
K = transpose(K);

%% // helper function that calls repmat:
f = @(v) repmat(v, length(K), 1);

%% // your matrix:
den = [f(1) f(5) K-6 K];

这应该更加优化速度,但需要比循环更多的中间内存。

答案 1 :(得分:1)

只需使用尺寸为1 * 3的reshape

den = reshape([ones(1,length(K));ones(1,length(K))*5; K-6; K],[1 4 length(K)]);

我认为reshape使用的额外内存应该是低且恒定的(仅取决于新尺寸矢量的长度)。

答案 2 :(得分:0)

您可以使用经典的线方程y=a*x+b,扩展为矩阵形式:

k = 2:2.5:10 ;
fa = [0 0  1 1].' ; %' // "a" coefficients
fb = [1 5 -6 0].' ; %' // "b" coefficients

d(1,:,:) = fa*k + fb*ones(1,4) ;

上面的内容更清楚,但如果你没有打扰,你也可以将所有内容打包成一行:

d(1,:,:) = [0 0  1 1].' * (2:2.5:10) + [1 5 -6 0].' * ones(1,4) ;

如果您需要为k的许多不同值重用该原则,那么您可以使用匿名函数来帮助:

fden = @(k) [0 0  1 1].' * k + [1 5 -6 0].' * ones(1,4) ; %// define anonymous function

k = 2:2.5:10 ; 
d(1,:,:) = fden(k) ; %// use it for any value of "k"