1

Octave で SOR アルゴリズムを実行する学校のプロジェクトがありますが、非常に非効率的です。だから私はこのコードスニペットを持っています:

for ii=1:n
    r = 1/A(ii,ii);
    for jj=1:n
        if (ii!=jj)
            A(ii,jj) = A(ii,jj)*r;
        end;
    end;
    b(ii,1) = b(ii,1)*r;
    x(ii,1) = b(ii,1);
end;

これをベクトル化するにはどうすればよいですか?私の最初の試みはこれでした:

for ii=1:n
    r = 1/A(ii,ii);
    A(find(eye(length(A))!=1)) = A(find(eye(length(A))!=1))*r;
    b(ii,1) = b(ii,1)*r;
    x(ii,1) = b(ii,1);
end;

しかし、それがあまり役に立ったかどうかはわかりません。それを行うためのより良いおよび/またはより効率的な方法はありますか?

ありがとう!

4

3 に答える 3

2

ランダムにこの問題に遭遇し、問題が問題としてタグ付けされているという事実を考えると、一見興味深いように見えましたvectorization

bsxfunも使用するベースのベクトル化されたソリューションを思いつくことができましたdiagonal indexing。このソリューションは3-4x、適切なサイズの入力を使用して、ループ コードよりも高速化されているようです。

この問題のスピードアップの改善にまだ興味があると仮定すると、どのようなスピードアップが得られるかを知りたいと思っています。ここにコードがあります -

diag_ind = 1:size(A,1)+1:numel(A);
diag_A = A(diag_ind(:));
A = bsxfun(@rdivide,A,diag_A);
A(diag_ind) = diag_A;
b(:,1) = b(:,1)./diag_A;
x(:,1) = b(:,1);

お知らせ下さい!

于 2014-09-30T19:47:04.753 に答える