这就是我想要的,一个三维矩阵:
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矩阵或单元阵列?
答案 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"