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

时间:2015-05-16 15:12:46

标签: 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函数中没有完整的包含标记“rows”不起作用。此外,我想知道指定元素的所有索引。 提前感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

方法1

要将SELECT * FROM EngineerData where Name=? and Password=? 从当前linear-index表单转换为行索引,请使用mod

F

您可以将此代码与您的代码合并为一行。另请注意,您可以直接使用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)就可以获得行号操作

方法2

使用bsxfunaccumarray

mod

如何运作

假设您的示例中为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为2x3矩阵

t

如果 m -th元素, m t = 1 1 0 0 0 1 行包含 n 列中的t1 n 行中出现B。这些值将使用B转换为行和列形式:

find

这意味着ii = 1 1 2 jj = 1 2 3 的第1行和第2行B ocurrs的第一个元素;第二个发生在A的第3行。

最后,B的值根据其对应的jj值进行分组(accumarray},以生成所需的结果。

答案 1 :(得分:3)

bsxfun&的一种方法accumarray -

>>> '3'.lower()
'3'

示例运行 -

%// Create a match of B's in A's with each column of matches representing the
%// rows in A where there is at least one match for each element in B 
matches = squeeze(any(bsxfun(@eq,A,permute(B(:),[3 2 1])),2))

%// Get the indices values and the corresponding IDs of B
[indices,B_id] = find(matches)
%// Or directly for performance:
%// [indices,B_id] = find(any(bsxfun(@eq,A,permute(B(:),[3 2 1])),2))

%// Accumulate the indices values using B_id as subscripts
out = accumarray(B_id(:),indices(:),[],@(x) {x})

答案 2 :(得分:1)

使用arrayfunismemberfind

[r,c] = arrayfun(@(x) find(ismember(A,x)) , B, 'uni',0);

r给出了您想要的结果,您还可以使用c变量获取B

中每个数字的列

示例输入的结果:

>> celldisp(r)

r{1} =
 1
 2

r{2} = 
 3


>> celldisp(c)

c{1} = 
 1
 1

c{2} =
 2