我有一个矩阵
m =
2 2 1
3 2 1
0 4 1
0 4 1
5 4 1
0 5 2
1 2 2
1 3 2
1 4 2
1 1 3
0 2 3
0 3 4
0 3 4
这可能是 N x 3,其中 N 可能非常大。
我想在第一列(1-13)中找到索引,其中我有零,但前提是存在重复行或行是唯一的。我不希望第二列和第三列相同但第一列不为零的行。换句话说,如果第一列中有一个零,但其在第二列和第三列中对应的数字与第一列中除零之外的数字不同的另一个相同,则忽略该零的索引。因此,在上面的示例中,我只想返回索引 6, 11,12, 13。不应返回索引 3,4,因为它们违反了存在与该行类似的行(第二列和第三列)的规则,但是第一列不同,如下所示:
0 4 1
0 4 1
5 4 1
一个缓慢的解决方案是找到第一列为 0 的行的索引 indm=m(:,1)==0
然后迭代矩阵的行检查是否矩阵 (m
) 中存在任何其他行,该行具有相同的第二列和第三列,但第一列不同。如果这种情况不存在,则将该行的索引添加到程序返回的列表中。
然而,这种方法需要“for 循环”来遍历大型矩阵。
最佳答案
解决这个问题的一种方法(假设如果有任何其他行具有相同的第 2 列和第 3 列,则该行是坏的)是找到所有不同的行,然后检查第一列是否在各处都相同。
%# uIdx is the same for sets of rows where m(i,2:3) is equal
[~,~,uIdx] = unique(m(:,2:3),'rows');
%# allZeros is true if all entries in the first column of m
%# corresponding to a set are the zero
allZeros = accumarray(uIdx,m(:,1),[],@(x)all(x==0));
%# a good row belongs to a set of rows from m(:,2:3)
%# where all corresponding entries in the first column are zeros
%# use allZeros(uIdx) to expand allZeros to size(m,1)
goodRowIndices = find(allZeros(uIdx) == true)
goodRowIndices =
6
11
12
13
关于matlab - 在特定位置查找索引的最简单/计算有效的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36798965/