我有一个类似
的矩阵A = [ 0 1 1;0 0 0;1 1 0]
为此,我希望以下列方式了解1
的索引:
对于第1行,我需要列的索引值,它等于1
。第2行和第3行也是如此。
后来,我想对列重复这个练习,就像第1列一样,我需要行的索引值,它等于1
。第2栏和第3栏也是如此。
ans
应该是这样的:
类似地:
请帮忙。
答案 0 :(得分:3)
使用find
和accumarray
:
[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的元素,它将保持一个空数组。
列的解决方案大致相同。