Arrays MATLAB可以高效地找到一个大型矩阵中包含三个元素中的两个元素的行
我有一个很大的矩阵,我们称之为a,它有维度Mx3,例如M=4000行x3列。矩阵中的每一行包含三个数字,例如[241 112 478]。在这三个数字中,我们可以构造三对,例如[241112]、[112478]、[241478]。在其他3999行中:Arrays MATLAB可以高效地找到一个大型矩阵中包含三个元素中的两个元素的行,arrays,performance,matlab,matrix,vectorization,Arrays,Performance,Matlab,Matrix,Vectorization,我有一个很大的矩阵,我们称之为a,它有维度Mx3,例如M=4000行x3列。矩阵中的每一行包含三个数字,例如[241 112 478]。在这三个数字中,我们可以构造三对,例如[241112]、[112478]、[241478]。在其他3999行中: 对于三对中的每一对,正好一行M(仅一行)将包含同一对。然而,数字的顺序可能会被打乱。例如,只有一行的内容为:[333 478 112]。没有其他行同时具有478和112我感兴趣的是为三对中的每一对找到该行的索引。然后,输出应该是另一个矩阵,称为B,
- 对于三对中的每一对,正好一行M(仅一行)将包含同一对。然而,数字的顺序可能会被打乱。例如,只有一行的内容为:[333 478 112]。没有其他行同时具有478和112我感兴趣的是为三对中的每一对找到该行的索引。然后,输出应该是另一个矩阵,称为B,具有相同维度4000x3,其中每一行都有原始矩阵A中共享一对数字的行的索引
- 没有其他行包含相同的三个数字
- 其他行可能不包含任何数字或其中一个数字
M=size(A,1); % no elements
B=zeros(M,3);
for j=1:M
l=1;
k=1;
while l<4 % there cant be more than 3
if k~=j
s=sum(ismember(A(j,:),A(k,:)));
if s==2
B(j,l)=k;
l=l+1;
end
end
k=k+1;
end
M=尺寸(A,1);%无元素
B=零(M,3);
对于j=1:M
l=1;
k=1;
虽然不需要lFor循环,但只需按以下方式使用ismember
:
row_id1=find(sum(ismember(M,[241 112]),2)>1);
row_id2=find(sum(ismember(M,[478 112]),2)>1);
row_id3=find(sum(ismember(M,[478 241]),2)>1);
每个row\u id
将为您提供该行中该对的行索引,而不管其显示顺序如何
这里所做的唯一假设是,您查找的一对数字将连续出现两次(即[112 333 112]
)。如果该假设是错误的,则可以使用unique
解决此问题