Arrays 在matlab中省略for循环
我将计算以下等式,其中有四个不同的变量。在计算这个方程时,有没有可能省略for循环Arrays 在matlab中省略for循环,arrays,matlab,for-loop,vectorization,Arrays,Matlab,For Loop,Vectorization,我将计算以下等式,其中有四个不同的变量。在计算这个方程时,有没有可能省略for循环 Z = p1 * sqrt(q1^2 + q2^2 * p2^2) 其中变量为: p=[(1,1) (1,2) (1,3) (1,4) (2,1) (2,2) (2,3) (2,4) (3,1) (3,2) (3,3) (3,4) (4,1) (4,2) (4,3) (4,4)]; 其中,第一个数字为p1,第二个数字为p2(例如,in(1,2),p1=1,p2=2)。 以及: 同样,第一个
Z = p1 * sqrt(q1^2 + q2^2 * p2^2)
其中变量为:
p=[(1,1) (1,2) (1,3) (1,4)
(2,1) (2,2) (2,3) (2,4)
(3,1) (3,2) (3,3) (3,4)
(4,1) (4,2) (4,3) (4,4)];
其中,第一个数字为p1,第二个数字为p2(例如,in(1,2),p1=1,p2=2)。
以及:
同样,第一个数字是q1,第二个数字是q2
在没有for循环的情况下,我如何计算每个变量的Z?要计算四个变量的每个组合的,在没有
for循环的情况下,使用:
例如,这将生成大小为16 x 16 x 16 x 16的结果Z
。Z
的第一个索引指向p1
,第二个指向p2
,第三个指向q1
,第四个指向q2
顺便说一句,在代码中,您需要将length
替换为numel
;就目前情况而言,您并不是从每个矩阵中获取所有元素
问题编辑后:
为p1
和q1
的每个组合计算,其中p2
的索引与p1
的索引相同,q2
的索引与q1
的索引相同:
[ii jj] = ndgrid(1:numel(p1), 1:numel(q1));
Z = pp1(ii) .* sqrt(qq1(jj).^2 + qq2(jj).^2 + pp2(ii).^2);
在你的例子中,它给出了大小为16x16的
Z
。我假设你的嵌套循环是这样的-
Z = zeros(length(p1),length(p2),length(q1),length(q2));
for i=1:length(p1)
for j=1:length(p2)
for m = 1:length(q1)
for n = 1:length(q2)
Z(i,j,m,n) = p1(i) * sqrt(q1(m)^2 + q2(n)^2 * p2(j)^2);
end
end
end
end
注意:numel
或size
比length
更适合使用,但在对问题进行修订之前,请将length
保留在代码中
现在,在p1
、q1
、p2
和q2
中,您有网格数据和许多相同的值,可用于代码优化和矢量化。这是一个带有bsxfun
-
impvals = bsxfun(@times,p1(:,1)',sqrt(q1(:,1).^2+(p2(1)*q2(1))^2)); %//'
Z = repmat(permute(impvals,[2 3 1 4]),[1 4 1 4]);
我使用给定的4x4
数据运行了这四个2D数组,每次运行100000次(为了更好地进行运行时测量),这就是运行时-
Elapsed time (with for-loops) is 5.684010 seconds.
Elapsed time (with bsxfun) is 4.441675 seconds.
我看不到任何循环。你到底想要什么?@Daniel我没有在这里写for循环,我想计算每个p1、p2、q1和q2的Z。实际上,对于这四个变量的每一个组合,我都会有一个Z.@user3482383检查一个基于bsxfun
的新解决方案,该解决方案在运行时性能方面表现出一定的潜力。我所做的编辑怎么样?在这种情况下,我如何改变您的想法?我尝试使用ndgrid而不是for循环,但计算时间比使用for循环的时间要长!在你看来,如果这些嵌套循环是用C++编写的,那么什么时候?@ USSR382483:运行时会是什么?我认为计算机一定是回答这个问题的最佳人选。为什么不写一个C++程序,在你的电脑上测试它呢?我不熟悉C++,所以我问你在不同编程中使用<<代码> for循环< /C> >的经验。languages@user3482383我也没有多少。此外,这必须是一个单独的问题,因为这是特定于MATLAB的。
impvals = bsxfun(@times,p1(:,1)',sqrt(q1(:,1).^2+(p2(1)*q2(1))^2)); %//'
Z = repmat(permute(impvals,[2 3 1 4]),[1 4 1 4]);
Elapsed time (with for-loops) is 5.684010 seconds.
Elapsed time (with bsxfun) is 4.441675 seconds.