Arrays 在matlab中省略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)。 以及: 同样,第一个

我将计算以下等式,其中有四个不同的变量。在计算这个方程时,有没有可能省略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)。 以及:

同样,第一个数字是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.