方法1
要将F从其当前的linear-index表单转换为行索引,请使用mod:
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)操作就可以获得行号.
方法2
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是2×3矩阵
t =
1 1 0
0 0 1
如果B的第m个元素出现在B的第n行,则第m行在第n列包含1.这些值通过find转换为行和列形式:
ii =
1
1
2
jj =
1
2
3
这意味着A的第1行和第2行的B ocurrs的第一个元素;第二个发生在B的第3行.
最后,根据jj的对应值将jj的值分组(使用准确数)以生成期望的结果.