方法一
将F
从当前的线性索引形式转换为行索引,使用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
使用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
< p > < em > t < / em > 的第 < em > m < / em > 行在列 < em > n < / em > 处包含 < code > 1 < / code > ,如果 < code > B < / code > 的第 < em > m < / em > 个元素出现在 < code > B < / code > 的第 < em > n < / em > 行。这些值通过 < code > find 转换为行和列形式: < / p >
ii =
1
1
2
jj =
1
2
3
这意味着
B
的第一个元素出现在
A
的第1行和第2行;第二个元素出现在
B
的第3行。
最后,使用
accumarray
将
jj
的值根据对应的
ii
值分组,生成所需的结果。
bsxfun
和accumarray
),对吗? - Luis Mendo