在Matlab矩阵中查找非零元素的索引

时间:2014-03-22 18:29:10

标签: matlab matrix

我有一个类似

的矩阵
A = [ 0 1 1;0 0 0;1 1 0]

为此,我希望以下列方式了解1的索引:

对于第1行,我需要列的索引值,它等于1。第2行和第3行也是如此。

后来,我想对列重复这个练习,就像第1列一样,我需要行的索引值,它等于1。第2栏和第3栏也是如此。

ans应该是这样的:

    第1行的
  • - 索引为:2,3
  • 第2行的
  • - 索引为:0
  • 第3行的
  • - 索引是:1,2

类似地:

    第1列的
  • - 索引为:3
  • 第2列的
  • - 索引是:1,3
  • 第3列的
  • - 索引为:1

请帮忙。

2 个答案:

答案 0 :(得分:3)

使用findaccumarray

[ii jj] = find(A); %// find row and col indices (ii and jj respectively)
rows = accumarray(ii,jj,[], @(v) {sort(v).'}); %'// group jj as per ii, and sort
cols = accumarray(jj,ii,[], @(v) {sort(v).'}); %'// group ii as per jj, and sort

对于您的示例,这给出了

>> rows{:}
ans =
     2     3
ans =
     []
ans =
     1     2
>> cols{:}
ans =
     3
ans =
     1     3
ans =
     1

如果您确实需要使用0填充空结果:

rows = accumarray(ii,jj,[], @(v) {sort(v).'}, {0}); %'// 5th input is fill value
cols = accumarray(jj,ii,[], @(v) {sort(v).'}, {0});

导致

>> rows{:}
ans =
     2     3
ans =
     0
ans =
     1     2
>> cols{:}
ans =
     3
ans =
     1     3
ans =
     1

答案 1 :(得分:0)

最简单的方法可能是使用循环和find函数结合单元格数组来存储你的答案。例如,要获取每行中的列表:

for i=1:size(A,1)
    rowsOne{i} = find(A(i,:)==1);
end
然后

rowsOne{i}包含一个向量,列出数组A的第i行中等于1的元素的索引。如果没有连续等于1的元素,它将保持一个空数组。

列的解决方案大致相同。