如何避免循环来减少这段代码的计算时间(
one solution of my last question):
我希望找到A(1:3,:)的列向量,其中M(4,:)中的对应值不是单元格X的向量之一(并且显然不等于这些向量之一)的一部分.如果X非常大,我寻找一个快速的解决方案.
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:
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]};
[~, ~, subs] = unique(M(1:3,:)','rows');
A4 = accumarray(subs(:),M(4,:).',[],@(x) {x});
%// getting a mask of which columns we want
idxC(length(A4)) = false;
for ii = 1:length(A4)
idxC(ii) = ~any(cellfun(@(x) all(ismember(A4{ii},x)), X));
end
显示我们想要的列
out = A(:,idxC)
结果:
>> out
out =
1007 4044
552 300
2010 1113
由于[2; 10; 55]包含在X {2} = [2 10 55 9 17]中,列矢量[5002; 431; 1100]被消除,
排除了列向量[622; 124; 88],因为[32 12] = X {4}
另一个例子:与X相同
M = [1007 4044 1007 4044 1007 5002 5002 5002 622 622 1007 1007 1007;
552 300 552 300 552 431 431 431 124 124 552 11 11;
2010 1113 2010 1113 2010 1100 1100 1100 88 88 2010 20 20;
12 25 15 12 30 2 10 55 32 12 7 12 7];
X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12]};
A = [1007 4044 5002 622 1077;
552 300 431 124 11;
2010 1113 1100 88 20];
结果:(用scmg回答)
我得到如果A按照第一行排序:(正确的结果)
out =
1007 1007 4044
11 552 300
20 2010 1113
如果我不排序矩阵A,我得到:(false result)
out =
4044 5002 622
300 431 124
1113 1100 88
由于[32 12] = X {4},列矢量A(:,4)= [622; 124; 88]应该被消除.
应该消除列向量[5002; 431; 1100],因为[2; 10; 55]包含在X {2} = [2 10 55 9 17]