Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何在Matlab中对这些嵌套for循环进行矢量化?_Performance_Matlab_For Loop_Runtime_Vectorization - Fatal编程技术网

Performance 如何在Matlab中对这些嵌套for循环进行矢量化?

Performance 如何在Matlab中对这些嵌套for循环进行矢量化?,performance,matlab,for-loop,runtime,vectorization,Performance,Matlab,For Loop,Runtime,Vectorization,我这里有一段代码需要简化,因为它大大提高了脚本的运行时间: size=300; resultLength = (size+1)^3; freqResult=zeros(1, resultLength); inc=1; for i=0:size, for j=0:size, for k=0:size, freqResult(inc)=(c/2)*sqrt((i/L)^2+(j/W)^2+(k/H)^2); inc=inc+

我这里有一段代码需要简化,因为它大大提高了脚本的运行时间:

size=300;
resultLength = (size+1)^3;
freqResult=zeros(1, resultLength);

inc=1;

for i=0:size,
    for j=0:size,
        for k=0:size,
            freqResult(inc)=(c/2)*sqrt((i/L)^2+(j/W)^2+(k/H)^2);
            inc=inc+1;
        end
    end
end
c、 L、W和H都是常数。当输入的大小超过400时,运行时间就太长,无法等待,我可以看到我的磁盘空间以千兆字节的速度耗尽。有什么建议吗

谢谢

这个呢:

[kT, jT, iT] = ind2sub([size+1, size+1, size+1], [1:(size+1)^3]); 
for indx = 1:numel(iT)

    i = iT(indx) - 1;
    j = jT(indx) - 1;
    k = kT(indx) - 1;        

    freqResult1(indx) = (c/2)*sqrt((i/L)^2+(j/W)^2+(k/H)^2);
end
在我的电脑上,尺寸=400时,3个循环的版本需要136秒,而这一个需要19秒

要了解更多“matlaby”方法,您甚至可以执行以下操作:

[kT, jT, iT] = ind2sub([size+1, size+1, size+1], [1:(size+1)^3]); 
func = @(i, j, k) (c/2)*sqrt((i/L)^2+(j/W)^2+(k/H)^2);
freqResult2 = arrayfun(func, iT-1, jT-1, kT-1);
但由于某些原因,这比上述版本慢。

更快的解决方案可能是(根据Marcin的回答):

在我的电脑上运行
size=300大约需要5秒钟

以下速度更快(但看起来不是很好):


对于
size=300,
freqResult=0(1,size^3),需要约3.5s的时间
我忘了提到我预先分配了以下语句:
resultLength=(size+1)^3;freqResult=零(resultLength,1)不过我认为您的订购是正确的。
   [k, j, i] = ind2sub([size+1, size+1, size+1], [1:(size+1)^3]); 
   freqResult = (c/2)*sqrt(((i-1)/L).^2+((j-1)/W).^2+((k-1)/H).^2); 
   k = repmat(0:size,[1 (size+1)^2]);
   j = repmat(kron(0:size, ones(1,size+1)),[1 (size+1)]);
   i = kron(0:size, ones(1,(size+1)^2));
   freqResult = (c/2)*sqrt((i/L).^2+(j/W).^2+(k/H).^2);