我正在尝试编写代码以从“距离”矩阵中查找每行的最小元素的索引,不包括矩阵中的零。
问问题
1219 次
2 回答
1
如果距离矩阵是一个(大)稀疏矩阵,这个问题就更不简单了。最好的方法可能是从每行中的每个非零元素中减去(最大值 * 2)。这看起来很丑陋和骇人听闻,但我想不出任何其他有效的方法来解决它。
sub = max(0, max(myArray,[],2) * 2);
[i,j,v] = find(myArray);
v -= sub;
myArray = sparse(i,j,v);
[junk mi] = min(myArray,[],2);
编辑:如果一行中的元素具有非常不同的大小,仍然存在精度问题。如果是这种情况,您可以取而代之的是负逆。通过这种方式,您不会将矩阵中不同元素的幅度(或任何常数)组合在一起
posOnly = ~any(myArray < 0, 2);
[i,j,v] = find(myArray);
inds = posOnly(i);
v(inds) = -1 ./ v(inds);
myArray = sparse(i,j,v);
[junk mi] = min(myArray,[],2);
(注意使用 ~any(myArray < 0) 而不是 all(myArray >= 0) 因为 (myArray < 0) 至少与 myArray 一样稀疏,而 (myArray >= 0) 不稀疏)
于 2013-07-16T15:31:58.760 回答
1
使用丹的提示:
myArray(myArray==0)=Inf;
[m mi] = min(myArray, [], 2);
的值mi
将是每行中最小元素的索引。请注意,最小值是沿第二维取的(根据 dspyz 的建议)。
于 2013-07-16T15:11:17.760 回答