我有一个矩阵M
和一个单元格X
,如下所示。 A
包含M(1:3,:)
的唯一列向量。 A
仅用于解释我想要的内容,这不是初始数据。
我尝试修改下面的程序,以便找不到A(1:3,:)
的列向量,而M(4,:)
中的对应值不属于单元格X
的一个向量的一部分(并且显然不等于这些载体之一)。现在,我想找到A(1:3,:)
的列向量,其M(4,:)
中的对应值至少包含一个单元格X
的向量(或等于这些向量之一)。
例如,结果应为:
out =
622 1007
124 552
88 2010
我想修改的代码:
M = [1007 1007 4044 1007 4044 1007 5002 5002 5002 622 622;
552 552 300 552 300 552 431 431 431 124 124;
2010 2010 1113 2010 1113 2010 1100 1100 1100 88 88;
7 12 25 15 12 30 2 10 55 32 12];
A = [1007 4044 5002 622;
552 300 431 124;
2010 1113 1100 88];
A
包含M(1:3,:)
X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12],[30 12 15]};
[C,~, subs] = unique(M(1:3,:)','rows');
A4 = accumarray(subs(:),M(4,:).',[],@(x) {x});
idxC = true(size(A4));
NX = numel(X);
for ii = 1:length(A4)
for jj = 1:NX
xj = X{jj};
issubset = true;
for A4i=A4{ii}.'
if ~ismember(A4i, xj)
issubset = false;
break;
end;
end;
if issubset
idxC(ii) = false;
break;
end;
end;
end;
out = C(idxC,:).';
有两个快捷方式。一,如果在A4{ii}
中找不到X{jj}
的任何元素,请不要测试A4{ii}
的其余部分,请从下一个jj
开始。其次,如果在A4{ii}
中找到X{jj}
的所有元素,请不要测试jj
的剩余值,请删除A4{ii}
。
>> out
out =
1007 4044
552 300
2010 1113
我尝试了这段代码,它给出了正确的结果,但我不知道它是否正确:
M = [1007 1007 4044 1007 4044 1007 5002 5002 5002 622 622;
552 552 300 552 300 552 431 431 431 124 124;
2010 2010 1113 2010 1113 2010 1100 1100 1100 88 88;
7 12 25 15 12 30 2 10 55 32 12];
X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12],[30 12 15]};
[C,~, subs] = unique(M(1:3,:)','rows');
A4 = accumarray(subs(:),M(4,:).',[],@(x) {x});
idxC = false(size(A4));
NX = numel(X);
for jj = 1:NX
for ii = 1:length(A4)
A4i=A4{ii};
issubset = false;
for xj = X{jj}.'
if ismember(xj,A4i)
issubset = true;
break;
end;
end;
if issubset
idxC(ii) = true;
break;
end;
end;
end;
out = C(idxC,:).';
out =
622 1007
124 552
88 2010
答案 0 :(得分:0)
我的方法就是这样做的。在阅读之前,请记住它可能不是最快/最棘手的方法。
%Extracting the values of M(4,:) as blocks (I kept your way to do it)
[C, ~, subs] = unique(M(1:3,:)','rows');
A4 = accumarray(subs(:),M(4,:).',[],@(x) {x});
%Finding which A4 elements contains at least a vector of x
containsX = arrayfun(@(it)cellfun(@(x)all(ismember(x,A4{it})),X),1:length(A4),'UniformOutput',0)';
%Converting containsX into array so I can use `any`
containsX_array = cell2mat(containsX);
%Extracting the elements of A concerned
out = A(:,find(ismember(A',C(any(containsX_array,2),1:3),'rows')));
我确实在一些例子上运行它,它似乎没有问题。
%TEST :
M = [1007 1007 4044 1007 4044 1007 5002 5002 5002 622 622;
552 552 300 552 300 552 431 431 431 124 124;
2010 2010 1113 2010 1113 2010 1100 1100 1100 88 88;
7 12 25 15 12 30 2 10 55 32 12];
A = [1007 4044 5002 622;
552 300 431 124;
2010 1113 1100 88];
X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12],[30 12 15]};
>> out
out =
1007 622
552 124
2010 88
答案 1 :(得分:0)
M = [1007 1007 4044 1007 4044 1007 5002 5002 5002 622 622;
552 552 300 552 300 552 431 431 431 124 124;
2010 2010 1113 2010 1113 2010 1100 1100 1100 88 88;
7 12 25 15 12 30 2 10 55 32 12];
X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12],[30 12 15]};
[C,~, subs] = unique(M(1:3,:)','rows');
A4 = accumarray(subs(:),M(4,:).',[],@(x) {x});
idxC = false(size(A4));
NX = numel(X);
for jj = 1:NX
for ii = 1:length(A4)
A4i=A4{ii};
issubset = false;
for xj = X{jj}.'
if ismember(xj,A4i)
issubset = true;
break;
end;
end;
if issubset
idxC(ii) = true;
break;
end;
end;
end;
out = C(idxC,:).';
out =
622 1007
124 552
88 2010