我在这里有一段代码我需要简化,因为它大大增加了我的脚本的运行时间:
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时,运行时间太长而无法等待,我可以看到我的磁盘空间耗尽了千兆字节。有什么建议吗?
谢谢!
答案 0 :(得分:0)
这个怎么样:
[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
在我的电脑上,对于size = 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);
但由于某些原因,这比上述版本慢。
答案 1 :(得分:0)
更快的解决方案可以(基于Marcin的答案):
[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);
在我的电脑上运行size = 300
以下情况更快(但看起来不太好):
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);
size = 300