【问题标题】:Rectifying compute_curvature.m error in Toolbox Graph in Matlab纠正 Matlab 工具箱图中的 compute_curvature.m 错误
【发布时间】:2017-12-10 01:34:19
【问题描述】:

我目前正在使用 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 将在第 75 行 ("dp = sum( normal(:,E(:,1)) .* normal(:,E(:,2)), 1 );") 上为某些曲面生成错误。 错误源于 E 包含超出范围的索引 由第 48 行(“A = sparse(double(i),double(j),s,n,n);”)引起,其中A's 值最终完全构成E 矩阵。出现问题 当ij 向量两次创建相同的有序对时,其中 如果稀疏函数将两个 s 向量元素相加,则 该矩阵位置导致值太大而无法使用 作为第 75 行的索引。例如,如果 i = [1 1]j = [2 2]s = [3 4]A(1,2) 将等于 3 + 4 = 7

ij 向量在此处创建:
i = [face(1,:) face(2,:) face(3,:)];
j = [face(2,:) face(3,:) face(1,:)];

只是想补充一下,我提到的错误是由 翻转一个面的表面法线的符号 重新排列人脸矩阵中顶点的顺序"

我已经尝试自己调试代码,但没有任何运气。我想知道这里是否有人解决了这个问题或能给我一些见解——我需要代码足够通用,以便计算各种曲面的曲率,而不仅仅是少数几个曲面。

【问题讨论】:

  • 您尝试过给作者发电子邮件吗? gabriel.peyre 'at' ceremade.dauphine.fr
  • 我做到了,正在等待回音。但是我想对冲 Stack Overflow 上的赌注。

标签: matlab


【解决方案1】:

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);

由于我对算法没有详细的了解,因此很难判断删除条目是否会产生负面影响。

【讨论】:

    猜你喜欢
    • 2016-08-20
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2014-12-27
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多