这是我想要的,一个3-D矩阵:
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矩阵或单元阵列?
发布于 2015-07-03 17:29:47
您需要在列中“广播”标量值,以便它们与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];这应该对速度进行更多的优化,但比循环需要更多的中间内存。
发布于 2015-07-03 17:54:30
只需使用1*3大小的reshape:
den = reshape([ones(1,length(K));ones(1,length(K))*5; K-6; K],[1 4 length(K)]);我认为reshape使用的额外内存应该是低且恒定的(仅取决于新大小的向量的长度)。
发布于 2015-07-03 18:55:51
您可以使用经典的线等式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"https://stackoverflow.com/questions/31202612
复制相似问题