以矩阵A(n * 2)为源,矩阵B为向量,其中包含元素A的子集,我想找到项的行索引。
A=[1 2;1 3; 4 5];
B=[1 5];
F=arrayfun(@(x)(find(B(x)==A)),1:numel(B),'UniformOutput',false)
根据此帮助页面在单元格中提供以下输出
[2x1 double] [6]
指示所有出现索引。但是我想要行的索引。即我想知道元素1出现在第1行和第2行,元素5出现在第3行。如果索引是逐行的,我可以使用ceil(F {x} / 2)获得所需的输出。现在,随着行数的变化,您建议的解决方案是什么?可能发生的情况是,ismember函数中没有完整的包含标记“行”不起作用。此外,我想知道指定元素的所有索引。在此先感谢您的帮助。
rows = cellfun(@(x) mod(x-1,size(A,1))+1, F, 'UniformOutput', false);
您可以将其与代码合并为一行。另请注意,您可以直接将其B
用作的输入arrayfun
,从而避免了索引的一个阶段:
rows = arrayfun(@(x) mod(find(x==A)-1,size(A,1))+1, B(:), 'UniformOutput', false);
运作方式:
F
如您的代码所给定的,是列优先形式的线性索引。这意味着索引从的第一列B
开始,从第二列的顶部开始,然后再次向下,依此类推。因此,行号可以通过模(mod
)操作获得。
使用bsxfun
和accumarray
:
t = any(bsxfun(@eq, B(:), reshape(A, 1, size(A,1), size(A,2))), 3); %// occurrence pattern
[ii, jj] = find(t); %// ii indicates an element of B, and jj is row of A where it occurs
rows = accumarray(ii, jj, [], @(x) {x}); %// group results according to ii
运作方式:
假设A
和B
在您的示例中一样,t
是2x3矩阵
t =
1 1 0
0 0 1
所述米的第行t
包含1
在列Ñ如果米的个元素B
在发生Ñ的第行B
。这些值将通过以下方式转换为行和列形式find
:
ii =
1
1
2
jj =
1
2
3
这意味着B
o的第一个元素出现在的第1行和第2行A
。第二个发生在的第3行B
。
最后,将的值根据其相应的值jj
分组(用accumarray
),ii
以生成所需的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句