いくつかの配列演算を実行するコードに問題があります。ループを使用し、入力データが非常に大きいので、遅すぎます。それは私のための最も簡単な方法だったが、今は私はループよりも速いものを探している。私はコードを最適化または書き直そうとしていましたが、失敗しました。私はあなたの助けを本当に寄付します。私のコードでMATLABでループなしの行列計算
私は3つのアレイx1
、y1
(グリッド内の点の座標)、g1
(ポイント値)と、例えばそれらのサイズは300×300であり、Iは、9の組成物として各マトリックスを治療及びIが作るを有します中央の点の計算。たとえば、g1(101,101)
で始まりますが、私はg1(1:201,1:201)=g2
のデータを使用しています。 g1(1:201,1:201)
からg1(101,101)
(ll
行列)の各点からの距離を計算する必要があります。次に、コード内のnnを計算し、次にg1(101,101)
の値をnnから見つけ、N
配列に入れます。その後、私は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;