首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用矢量化代码高效地得到三维矩阵或单元阵列?

如何使用矢量化代码高效地得到三维矩阵或单元阵列?
EN

Stack Overflow用户
提问于 2015-07-03 16:56:08
回答 3查看 71关注 0票数 2

这是我想要的,一个3-D矩阵:

代码语言:javascript
复制
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

或者,单元阵列也是可接受的:

代码语言:javascript
复制
K = 2:2.5:10;
for i = 1:1:4
    den{i} = [1, 5, K(i)-6, K(i)];
end

但我想知道是否有一种更有效的方法来使用矢量化代码来实现这一点,比如:

代码语言:javascript
复制
K = 2:2.5:10;
den = [1, 5, K-6, K];

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

代码语言:javascript
复制
v = [1 2 3];
v2 = v.^2;

而不是:

代码语言:javascript
复制
v = [1 2 3];
for i = 1:length(v)
    v(i) = v(i)^2;
end

才能得到我想要的矩阵。有没有类似的方法,这样我就可以更有效地获得我在开始时提到的3-D矩阵或单元阵列?

EN

回答 3

Stack Overflow用户

发布于 2015-07-03 17:29:47

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-07-03 17:54:30

只需使用1*3大小的reshape

代码语言:javascript
复制
den = reshape([ones(1,length(K));ones(1,length(K))*5; K-6; K],[1 4 length(K)]);

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

票数 1
EN

Stack Overflow用户

发布于 2015-07-03 18:55:51

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

代码语言:javascript
复制
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) ;

为了清晰起见,上面的代码更好,但如果您不介意,也可以将所有内容打包到一行中:

代码语言:javascript
复制
d(1,:,:) = [0 0  1 1].' * (2:2.5:10) + [1 5 -6 0].' * ones(1,4) ;

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

代码语言:javascript
复制
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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31202612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档