将矩阵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”不起作用。此外,我想知道指定元素的所有索引。 提前感谢您的帮助。
答案 0 :(得分:3)
要将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
)就可以获得行号操作
使用bsxfun
和accumarray
:
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
和A
,B
为2x3矩阵
t
如果 m -th元素, m 第t =
1 1 0
0 0 1
行包含 n 列中的t
在1
的 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)