3

N = 570*720 = 410400 (画像ピクセル数) の大きな NxN スパース バンド マトリックス A を作成する必要があります。

数学的には、A(m,n) = C1 * exp(-|mn|^2); m = 1:N、n = 1:N

基本的には、各行で評価されるガウス関数であり、行インデックスは平均であり、任意ではあるが小さな標準偏差です。

N = 100 の場合、次のようになります。ガウス

残念ながら、不要な計算のため、N = 410400 の場合は非常に遅くなります。

1) for ループの使用

A = sparse(N,N);
for i=1:N
A(i,:) = normpdf(1:N, i, 30);
end

これは、normpdf を N 回呼び出すため、無駄で遅くなります。

2) N での平均を使用して 1:2N の normpdf を 1 回計算し、インデックスに基づく適切な平均で A の行を循環的にシフトします。matlab の circshift は、シフト サイズが異なる行列を列ごとにシフトできません。ここでも circshift を N 回呼び出す必要があります --> 無駄です。

3)おそらくmvnpdfを使用しますが、入力ベクトルが必要であり、メッシュグリッドでこれらを生成すると
大量のメモリが消費されます。

4) bsxfun は 3 つ以上の引数を取らないため、2 つのパラメーターを受け入れるユーザー定義のガウス関数 (固定 SD を使用) で bsxfun を使用します。

これを効率的に達成する方法についてのアイデアはありますか?

ありがとう

4

2 に答える 2

3

まず、少なくとも 50% のゼロがあり、行列がfullでない限り、スパース行列は本当に必要ありません。

通常のpdfを考えてみましょう

ここに画像の説明を入力

次の呼び出しを含めて簡単に実装できますbsxfun()

N   = 100;
s   = 30;
m   = 1:N;
pdf = @(x) 1/(sqrt(2*pi)*s)*exp(-0.5*(bsxfun(@minus,x(:),m)/s).^2);
B   = pdf(1:N);

と を使用した簡単な例はmean = 1、次のsigma = 30ことを明確にします。

pdf = @(x) 1/(sqrt(2*pi)*30)*exp(-0.5*((x-1)/30).^2);
pdf(1)
ans =
        0.0132980760133811

normpdf(1, 1, 30)
ans =
        0.0132980760133811
于 2013-06-10T19:55:21.420 に答える