0

我正在尝试编写代码以从“距离”矩阵中查找每行的最小元素的索引,不包括矩阵中的零。

4

2 回答 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 回答