Matlab 提取特定子列的矩阵操作:反向思想
我有一个矩阵Matlab 提取特定子列的矩阵操作:反向思想,matlab,matrix,cell-array,Matlab,Matrix,Cell Array,我有一个矩阵M和一个单元格X,如下所示A包含唯一的M(1:3,:)列向量A的引入只是为了解释我想要什么,这不是初始数据 我尝试修改下面的程序,以代替查找A(1:3,:)的列向量,其M(4,:)中的对应值不是单元格X的向量之一的一部分(显然不等于这些向量之一)。现在,我想找到A(1:3,:)的列向量,其M(4,:)中的对应值至少包含一个单元格X的向量(或等于这些向量之一)。 例如,结果应为: out = 622 1007 124 552
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];
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
A
包含唯一的M(1:3,:)
有两条捷径。第一,如果在X{jj}
中找不到A4{ii}
的任何元素,不要测试A4{ii}
的其余部分,从下一个jj
开始。其次,如果在任何X{jj}
中找到A4{ii}
的所有元素,则不要测试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];
A = [1007 4044 5002 622;
552 300 431 124;
2010 1113 1100 88];
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
这是我的方法。在阅读之前,请记住这可能不是最快/最棘手的方法
%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
“我想修改下面的程序…”好的,你尝试过修改程序吗?如果是的话,你在哪里被卡住了?由于您的问题目前已编写完毕,您似乎只是要求Stackoverflow为您编写代码。@Biker:我不是每天都编程,即使对于您认为简单的问题,我也很难解决。这不是为了成功,而是为了尝试。解释您不想要的东西有时是有用的,但通常不足以让人们轻易地帮助你。请在您的问题描述中包含类似的内容:我有变量M、A和X,如下所示。M是包含…的变量,a是包含…的变量,X是包含…的变量。我想要达到的是,我试过这样做。。。(看起来你在第一段中已经试过这么做了,但这很让人困惑)谢谢你的回答。它可以工作,但我想更改的代码更快!