Matlab 某些条件下的约化矩阵.第3部分-

Matlab 某些条件下的约化矩阵.第3部分-,matlab,matrix,Matlab,Matrix,M是由多个子矩阵Ai组成的矩阵,因此Ai(1:3,j)是j=1,…,大小(Ai,2)的相同向量。 此问题的唯一初始数据是M和V 我的目标是消除M的所有子矩阵Ai,前提是Ai(4,:)至少不包含numel(V)-2的V值 对于我的示例A1,A2和A3验证此条件。 预期输出(列的顺序不重要): 如何更改以下内容以解决我的问题: [~,~,idx] = unique(M(1:3,:)','rows') %//' valid = ismember(M(4,:),V) valid_idx = accum

M
是由多个子矩阵
Ai
组成的矩阵,因此
Ai(1:3,j)
j=1,…,大小(Ai,2)的相同向量。

此问题的唯一初始数据是
M
V

我的目标是消除
M
的所有子矩阵
Ai
,前提是
Ai(4,:)
至少不包含
numel(V)-2
V

对于我的示例
A1
A2
A3
验证此条件。 预期输出(列的顺序不重要):

如何更改以下内容以解决我的问题:

[~,~,idx] = unique(M(1:3,:)','rows')  %//'
valid = ismember(M(4,:),V)
valid_idx = accumarray(idx(valid),M(4,valid).',[],@(x) ...
                                 numel(unique(x)))>=numel(V) %//'
out = M(:,ismember(idx,find(valid_idx)))

看看这对你有用吗-

%// ID columns of M based on the uniquenes of the first thre rows
[~,~,idx] = unique(M(1:3,:).','rows')  %//'

%// For each ID detect if it satisfies the ">= numel(V)-2" criteria 
matches = accumarray(idx(:),M(4,:)',[],@(x) sum(ismember(V,x))>=numel(V)-2 )

%// Use the valid ID's to select the valid unique groups for desired output
out = M(:,ismember(idx,find(matches)))

数字5不是
V
的一部分,但它是在
M(4,:)
中看到的最终输出的一部分。另外,2、71和6在
M(4,:)
中至少有两个值,并且这些值也没有被我们期望的消除。9也不是
M(4,:)
的一部分,所以我们希望什么都不会发生。你能验证一下你想要的输出,看看这是否一致吗?另外,你能再检查一下我对你的问题的理解是否正确吗?@rayryeng:我的目标是消除M的所有子矩阵Ai,如果Ai(4,:)至少不包含numel(V)-2个V值!5不是V的一部分,但在我的示例中,numel(V)-2=2。所以,Ai(4,:)应该至少包含2个V值。非常感谢各位。我试着从你的一个旧答案中汲取灵感,但是运行时间太长了!!我仍然无法理解代码的某些部分!伟大的您的代码将在9秒内执行,而不是等待1000秒!
[~,~,idx] = unique(M(1:3,:)','rows')  %//'
valid = ismember(M(4,:),V)
valid_idx = accumarray(idx(valid),M(4,valid).',[],@(x) ...
                                 numel(unique(x)))>=numel(V) %//'
out = M(:,ismember(idx,find(valid_idx)))
%// ID columns of M based on the uniquenes of the first thre rows
[~,~,idx] = unique(M(1:3,:).','rows')  %//'

%// For each ID detect if it satisfies the ">= numel(V)-2" criteria 
matches = accumarray(idx(:),M(4,:)',[],@(x) sum(ismember(V,x))>=numel(V)-2 )

%// Use the valid ID's to select the valid unique groups for desired output
out = M(:,ismember(idx,find(matches)))