matlab - 查找矩阵中不同值的行索引

标签 matlab find row cell indices

将矩阵 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)

在单元格中给出以下输出 according to this help page

[2x1 double]    [6]

按列指示所有出现的索引。但我想要行的索引。即我想知道元素 1 出现在第 1 行和第 2 行中,而元素 5 恰好出现在第 3 行中。如果索引是按行排列的,我可以使用 ceil(F{x}/2) 获得所需的输出.现在行数可变,您建议的解决方案是什么?因为它可能发生在 ismember 函数中没有完整的包含标记“行”不起作用。此外,我想知道指定元素的所有索引。 在此先感谢您的帮助。

最佳答案

方法一

从当前的 linear-index 转换 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) 操作。

方法二

使用 bsxfunaccumarray :

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

这是如何运作的:

假设 AB 在您的示例中,t 是 2x3 矩阵

t =
     1     1     0
     0     0     1

如果m<,t 的第 m 行在 n 列包含 1 B 的第/em> 个元素出现在 B 的第 n 行。使用 find 将这些值转换为行和列形式:

ii =
     1
     1
     2
jj =
     1
     2
     3

这意味着 B 的第一个元素出现在 A 的第 1 行和第 2 行;第二个出现在 B 的第 3 行。

最后,jj 的值根据它们对应的 ii 值进行分组(使用 accumarray)以生成所需的结果。

关于matlab - 查找矩阵中不同值的行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30277297/

相关文章:

c++ - Microsoft Visual C++ 2008 和 R2007b 的 Mex 类型

linux - 递归地chmod

swift - 如何编辑单元格行?

php - 使用ajax将行添加到表的末尾

c - 如何找到矩阵 C 中的中位数(行和列)

Matlab cat() 函数 : index exceeds matrix dimensions

matlab - Matlab 求解器中的相对和绝对公差定义

matlab - 在 Matlab 中创建相关图

c++ - 查找数组中的重复数字

C++使用std库在满足条件的 vector 中找到第一个元素