matlab中连续减,matlab – 如何避免循环来减少这段代码的计算时间?

如何避免循环来减少这段代码的计算时间(

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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值