- 主题:请问这个程序为什么越来越慢?
u2 = exp(i.*zeros(8192,8192));
for ite1 = 1:800
for ite2 = 1:900
u = exp(i.*sqrt(xy_2d- z_2d(ite1,ite2)));
u2 = u2.*u;
end
end
这个程序越来越慢,请问是什么原因?请问有什么办法加速或者让他匀速运行吗?
※ 修改:·novicer 于 Sep 9 10:01:02 2021 修改本文·[FROM: 143.198.64.*]
※ 来源:·水木社区
http://www.mysmth.net·[FROM: 49.66.217.*]
修改:novicer FROM 143.198.64.*
FROM 49.66.217.*
能稍微详细说下怎么该吗?多谢!
u2 = exp(i.*zeros(8192,8192));
for ite1 = 1:800
for ite2 = 1:900
u = exp(i.*sqrt(xy_2d- z_2d(ite1,ite2)));
u2 = u2.*u;
end
end
【 在 zszqzzzf 的大作中提到: 】
: prod
--
修改:novicer FROM 143.198.64.*
FROM 143.198.64.*
整个u2提到循环外,怎么保存u呢?u本身是一个800*900的矩阵,如果要保存,循环之后好像是8192*8192*800*900个元素
【 在 zszqzzzf 的大作中提到: 】
: u2整个提取到循环外,可以用prod,对矩阵求累积。
: 双重循环计算也是慢的。如果你能做到消灭两个for,改成矩阵运算,速度可以提高百倍。
: cellfun翻一翻看看能不能就取代ite1和ite2,……
: ...................
--
FROM 143.198.231.*
非常感谢!请问2维变1维会更快吗?
循环里面的i好像可以提到循环外?
【 在 shaolimin 的大作中提到: 】
: temp = zeros(8192,8192);
: for ite = 1:720000
: temp = temp + i*sqrt(xy_2d - z_2d(ite));
: ...................
--
FROM 49.66.217.*
如果内存足够大,能不能把后一个矩阵变成(8192*8192) * (800*900)的二维矩阵,从而不用for循环?
【 在 shaolimin 的大作中提到: 】
: 2维变1维是为了减少一个循环。
: 循环里面的i确实可以提到循环外。
:
--
FROM 49.66.217.*
写了个3重循环,是这样的
diffx = xsource_temp2(ite1,ite2,ite3) - xsource2d(ite3);
diffy = ysource_temp2(ite1,ite2,ite3) - ysource2d(ite3);
diffx和diffy都是0
【 在 shaolimin 的大作中提到: 】
: xource_temp2(:, :, k)中的元素都相等,且等于xsource2d(k);
: yource_temp2(:, :, k)中的元素都相等,且等于ysource2d(k);
: k从1到size1*size2。
: ...................
--
FROM 49.66.217.*
基本搞定了,还有个小问题。之前for循环里有一句判断语句,if b(ite)~=0,也就是:
for ite1 = 1:size1*size2
if b(ite)~=0
sum_u2 = sum_u2 + sqrt(1+((x2d-xsource2d(ite1))./zin).^2 +((y2d-ysource2d(ite1))./zin).^2);
end
end
现在改为:
b_temp = repmat(b,[size1,1 size2]);
b_temp2 = permute(b_temp,[1 3 2]);
ind=find(b_temp2~=0);
[i1,i2,i3]=ind2sub(size(b_temp2),ind);
。。。
sum_u2 = ... x2d_temp(i1,i2,i3) ...
出现错误提示:超出了程序允许的最大变量值。请问这是什么问题?非常感谢!
【 在 shaolimin 的大作中提到: 】
: 那就对了,说明除去循环是成功的。你再检查一下其他语句。
:
--
FROM 192.155.87.*
貌似不行。xsourece2d本来是个二维矩阵(坐标值),
xsource2d(indices) = [];
ysource2d(indices) = [];
之后都变成一维了
【 在 shaolimin 的大作中提到: 】
: 从循环代码可以看出,向量b不参与运算,只是如果b中的一个元素等于零,那么跳过一
: 次运算。所以,在运算前找到向量b中所有零元素的位置,保存在变量indices,然后xo
: urce2d(indices) = []; ysource2d(indices) = [],最后再进行运算,无需判断。
: ...................
--
修改:novicer FROM 117.80.211.*
FROM 117.80.211.*