1

私はいくつかの信号処理を行っており、ポアソン行列を生成する必要がありますが、使用しているデータが十分に大きいため、現在行っている方法で matlab がメモリ不足になります。

私はこれを少しいじっていましたが、現時点ではちょっと困惑しているので、行列を生成するより効率的な方法、つまりmatlabが不足する問題を解決する方法を見つけるのを手伝ってくれることを望んでいました.メモリー。

とにかく、ここに私がこれまでに持っているものがあります

n = 20;

B = zeros(n^2,n^2);
for i = 1:n^2
for j = 1:n^2
    if i == j
        B(i,j) = 4;
    elseif i == j+1
        B(i,j) = -1;
    elseif i == j-1
        B(i,j) = -1;
    elseif i == j+n
        B(i,j) = -1;
    elseif i == j-n
        B(i,j) = -1;
    end
end
end

for i = n:n:n^2-1
    for j = n:n:n^2-1
        B(i+1,j) = 0;
        B(i,j+1) = 0;
    end
end

C = sparse(B);

前もって感謝します!

4

1 に答える 1

2

努力のおかげでA +!しかし、これを行うためのより効率的な方法があります。スパース行列が必要です。次のようなものを試してください

n = 20;
e = ones(n^2,1);
o = e;
for i = n:n:n^2-1
    o(i) = 0;
end
A = spdiags([-e -o 4*e -o -e], [-(n+1) -1 0 1 (n+1)], n^2, n^2);

本当に自分で生成したい場合。この方法を投稿して、一般的な練習を使用してバンド付き疎行列を作成する方法を学習できるようにします。しかし、ポアソン行列の場合は、MATLAB に組み込まれているものを単純に使用できます。

B = gallery('poisson',n);

スパース行列が必要な理由を説明するために、n のさまざまな値のスパース性を次のようにチェックしてみてください。

sparsity = nnz(B)/prod(size(B));

数 n を 20 前後に増やすと、ポアソン行列が実際には疎であるため (1% 近くが非ゼロであるため)、実際に違いが生じる場合があります。MATLAB のこれらのゼロはすべて無駄なスペースです。したがって、完全な for ループ メソッドで B を生成しているときは、メモリを使い果たしています。違いを確認するには、次のような元のコードを試してください

sB = whos('B');
sC = whos('C');
disp(sA.bytes);
disp(sB.bytes);

n = 20 の場合、B = 1280000 バイト、C = 33928 バイトとなります。しかし、この所定の方法を使用すると、A = 33896 バイトになります。これは、ほぼ 1.2 MB の違いです。

于 2013-07-24T07:36:40.980 に答える