【发布时间】:2016-03-20 19:31:47
【问题描述】:
我对执行某些数组操作的代码有疑问。它太慢了,因为我使用循环并且输入数据很大。这对我来说是最简单的方法,但现在我正在寻找比 for 循环更快的方法。我试图优化或重写代码,但没有成功。非常感谢您的帮助。
在我的代码中,我有三个数组x1、y1(网格中点的坐标)、g1(点中的值),例如它们的大小为 300 x 300。我将每个矩阵视为组合9,我计算中间的点。例如,我从g1(101,101) 开始,但我使用的是来自g1(1:201,1:201)=g2 的数据。我需要计算从g1(1:201,1:201) 的每个点到g1(101,101)(ll 矩阵)的距离,然后我计算代码中的 nn,接下来我从 nn 中找到 g1(101,101) 的值并将其放入 @987654330 @ 大批。然后我转到g1(101,102),依此类推,直到g1(200,200),在最后一种情况下g2=g1(99:300,99:300)。
正如我所说,这段代码效率不高,即使我必须使用比示例中给出的更大的数组,也需要花费太多时间。我希望我能足够清楚地解释我对代码的期望。我正在考虑使用arrayfun,但我从未使用过这个函数,所以我不知道应该如何使用它,但在我看来它无法处理。也许还有其他解决方案,但是我找不到任何合适的解决方案。
tic
x1=randn(300,300);
y1=randn(300,300);
g1=randn(300,300);
m=size(g1,1);
n=size(g1,2);
w=1/3*m;
k=1/3*n;
N=zeros(w,k);
for i=w+1:2*w
for j=k+1:2*k
x=x1(i,j);
y=y1(i,j);
x2=y1(i-k:i+k,j-w:j+w);
y2=y1(i-k:i+k,j-w:j+w);
g2=g1(i-k:i+k,j-w:j+w);
ll=1./sqrt((x2-x).^2+(y2-y).^2);
ll(isinf(ll))=0;
nn=ifft2(fft2(g2).*fft2(ll));
N(i-w,j-k)=nn(w+1,k+1);
end
end
czas=toc;
【问题讨论】:
标签: arrays matlab for-loop matrix vectorization