5

私は現在、Matlab File Exchange の Toolbox Graph を使用して 3D サーフェスの曲率を計算しており、非常に役立つことがわかりました ( http://www.mathworks.com/matlabcentral/fileexchange/5355 )。ただし、特定のサーフェス記述に対して「compute_curvature」で次のエラー メッセージが発行され、コードが完全に実行されません。

> Error in ==> compute_curvature_mod at 75
> dp = sum( normal(:,E(:,1)) .* normal(:,E(:,2)), 1 );
> ??? Index exceeds matrix dimensions.

これは散発的にしか発生しませんが、(同様のトポロジの) 一部のサーフェスではツールボックスが完全に機能し、他のサーフェスでは機能しない明確な理由はありません。また、2009 年 11 月に File Exchange で誰かがこのバグについて質問したことにも気付きましたが、その質問には回答がありませんでした。投稿の状態

"compute_curvature は、一部dp = sum( normal(:,E(:,1)) .* normal(:,E(:,2)), 1 );のサーフェスに対して 75 行目 (" ") でエラーを生成します。このエラーは、 48 行目 (" ")Eによって引き起こされる範囲外のインデックスが含まれていることに起因します。とベクトルが同じ順序付けられたペアを 2 回作成すると問題が発生します。この場合、sparse 関数はその行列の位置に対して 2 つのベクトル要素を一緒に加算し、75 行目のインデックスとして使用するには大きすぎる値になります。たとえば、そしてに等しくなります。A = sparse(double(i),double(j),s,n,n);AEijsi = [1 1]j = [2 2]s = [3 4]A(1,2)3 + 4 = 7

iとベクトルは次のjように作成されます。
i = [face(1,:) face(2,:) face(3,:)];
j = [face(2,:) face(3,:) face(1,:)];

私が言及したエラーは、面マトリックス内の頂点の順序を再配置することにより、1 つの面の表面法線の符号が反転することによって引き起こされることを付け加えたかっただけです。」

私は自分でコードをデバッグしようとしましたが、うまくいきませんでした。ここで誰かが問題を解決したか、または私に洞察を与えることができるかどうか疑問に思っています.選択した少数だけでなく、さまざまな表面の曲率を計算するには、コードが十分に汎用的である必要があります.

4

1 に答える 1

0

File Exchange に関する 2009 年 11 月のバグ レポートでは、問題の原因を次の の動作にまでさかのぼりますsparse

S = SPARSE(i,j,s,m,n,nzmax) uses the rows of [i,j,s] to generate an
m-by-n sparse matrix with space allocated for nzmax nonzeros.  The
two integer index vectors, i and j, and the real or complex entries
vector, s, all have the same length, nnz, which is the number of
nonzeros in the resulting sparse matrix S .  Any elements of s 
which have duplicate values of i and j are added together.

問題が発生するコード行は次のとおりです。

i = [face(1,:) face(2,:) face(3,:)];
j = [face(2,:) face(3,:) face(1,:)];
s = [1:m 1:m 1:m];
A = sparse(i,j,s,n,n);

この情報に基づいて、おそらくuniqueまたは同様の方法で繰り返しインデックスを削除すると、問題解決する可能性があります。

[B,I,J] = unique([i.' j.'],'rows');
i = B(:,1).';
j = B(:,2).';
s = s(I);

完全なソリューションは次のようになります。

i = [face(1,:) face(2,:) face(3,:)];
j = [face(2,:) face(3,:) face(1,:)];
s = [1:m 1:m 1:m];
[B,I,J] = unique([i.' j.'],'rows');
i = B(:,1).';
j = B(:,2).';
s = s(I);
A = sparse(i,j,s,n,n);

私はアルゴリズムの詳細を理解していないため、エントリの削除が悪影響を与えるかどうかを判断するのは困難です.

于 2013-07-26T09:38:57.090 に答える