在Matlab中加速''ismember''

时间:2016-01-13 13:32:25

标签: performance matlab

我正在使用Matlab内置命令''ismember''来查看某个数据集是否在更大的数据集中。这段代码的目的是从下面显示的较大数据集中删除[0 0]行的任何倍数:

要做到这一点,我使用以下代码:

[Lia,locB] = ismember([0 0; 0 0],AFdata,'rows');
if sum(Lia) > 1 
AFdata(locB(1):locB(end-1),:) = [];

AFdata = [
1.0000   -0.0114
0.9975   -0.0098
0.9951   -0.0084
0.9928   -0.0074
0.9903   -0.0066
0.9804   -0.0042
0.9705   -0.0018
0.9606    0.0004
0.9507    0.0025
0.9408    0.0045
0.9309    0.0063
0.9210    0.0082
0.9111    0.0100
0.9012    0.0118
0.8913    0.0135
0.8814    0.0152
0.8715    0.0167
0.8616    0.0183
0.8517    0.0199
0.8418    0.0214
0.8318    0.0229
0.8219    0.0243
0.8120    0.0256
0.8021    0.0269
0.7922    0.0282
0.7823    0.0294
0.7724    0.0306
0.7625    0.0318
0.7526    0.0329
0.7427    0.0340
0.7328    0.0350
0.7229    0.0359
0.7130    0.0368
0.7031    0.0377
0.6932    0.0385
0.6833    0.0393
0.6734    0.0401
0.6635    0.0408
0.6536    0.0415
0.6437    0.0422
0.6338    0.0428
0.6239    0.0434
0.6140    0.0439
0.6041    0.0444
0.5942    0.0449
0.5843    0.0454
0.5744    0.0458
0.5645    0.0461
0.5546    0.0465
0.5447    0.0469
0.5348    0.0472
0.5249    0.0475
0.5150    0.0478
0.5051    0.0481
0.4951    0.0483
0.4852    0.0485
0.4753    0.0487
0.4654    0.0489
0.4555    0.0491
0.4456    0.0492
0.4357    0.0493
0.4258    0.0494
0.4159    0.0495
0.4060    0.0495
0.3961    0.0495
0.3862    0.0495
0.3763    0.0495
0.3664    0.0494
0.3565    0.0493
0.3466    0.0492
0.3367    0.0491
0.3268    0.0490
0.3169    0.0488
0.3070    0.0486
0.2971    0.0484
0.2872    0.0482
0.2773    0.0479
0.2674    0.0476
0.2575    0.0473
0.2476    0.0469
0.2377    0.0465
0.2278    0.0461
0.2179    0.0457
0.2080    0.0452
0.1981    0.0447
0.1882    0.0441
0.1783    0.0435
0.1684    0.0428
0.1584    0.0421
0.1485    0.0413
0.1386    0.0404
0.1287    0.0395
0.1188    0.0385
0.1089    0.0374
0.0990    0.0363
0.0891    0.0352
0.0792    0.0338
0.0693    0.0323
0.0594    0.0306
0.0495    0.0287
0.0396    0.0265
0.0297    0.0239
0.0198    0.0204
0.0099    0.0153
0.0050    0.0115
0.0020    0.0075
     0         0
     0         0
0.0020   -0.0075
0.0050   -0.0115
0.0099   -0.0153
0.0198   -0.0204
0.0297   -0.0239
0.0396   -0.0265
0.0495   -0.0287
0.0594   -0.0306
0.0693   -0.0323
0.0792   -0.0338
0.0891   -0.0352
0.0990   -0.0363
0.1089   -0.0375
0.1188   -0.0386
0.1287   -0.0396
0.1386   -0.0405
0.1485   -0.0414
0.1584   -0.0422
0.1684   -0.0429
0.1783   -0.0436
0.1882   -0.0442
0.1981   -0.0448
0.2080   -0.0454
0.2179   -0.0459
0.2278   -0.0463
0.2377   -0.0467
0.2476   -0.0471
0.2575   -0.0475
0.2674   -0.0478
0.2773   -0.0481
0.2872   -0.0484
0.2971   -0.0486
0.3070   -0.0488
0.3169   -0.0490
0.3268   -0.0491
0.3367   -0.0492
0.3466   -0.0493
0.3565   -0.0493
0.3664   -0.0493
0.3763   -0.0493
0.3862   -0.0492
0.3961   -0.0491
0.4060   -0.0490
0.4159   -0.0488
0.4258   -0.0486
0.4357   -0.0484
0.4456   -0.0481
0.4555   -0.0478
0.4654   -0.0474
0.4753   -0.0470
0.4852   -0.0465
0.4951   -0.0460
0.5051   -0.0455
0.5150   -0.0449
0.5249   -0.0442
0.5348   -0.0435
0.5447   -0.0427
0.5546   -0.0418
0.5645   -0.0408
0.5744   -0.0397
0.5843   -0.0386
0.5942   -0.0374
0.6041   -0.0362
0.6140   -0.0350
0.6239   -0.0337
0.6338   -0.0324
0.6437   -0.0310
0.6536   -0.0296
0.6635   -0.0281
0.6734   -0.0266
0.6833   -0.0252
0.6932   -0.0236
0.7031   -0.0220
0.7130   -0.0204
0.7229   -0.0188
0.7328   -0.0172
0.7427   -0.0156
0.7526   -0.0141
0.7625   -0.0125
0.7724   -0.0110
0.7823   -0.0095
0.7922   -0.0080
0.8021   -0.0067
0.8120   -0.0055
0.8219   -0.0045
0.8318   -0.0035
0.8418   -0.0026
0.8517   -0.0018
0.8616   -0.0012
0.8715   -0.0007
0.8814   -0.0004
0.8913   -0.0003
0.9012   -0.0004
0.9111   -0.0007
0.9210   -0.0012
0.9309   -0.0020
0.9408   -0.0030
0.9507   -0.0042
0.9606   -0.0055
0.9705   -0.0072
0.9804   -0.0092
0.9903   -0.0115
0.9928   -0.0119
0.9951   -0.0121
0.9975   -0.0119
1.0000   -0.0114]

但是,这段代码是针对多个数据集和多次迭代执行的,这使得这段代码变得缓慢。

有没有替代使用''ismember''?或者更快的方法来做到这一点。不幸的是我对编程并不擅长。

2 个答案:

答案 0 :(得分:9)

如果您使用逻辑索引,它会更快。

%create index
index = sum(AFdata' == 0)==2;
%clean AFdata
AFdata(index,:) = [];

答案 1 :(得分:3)

这是obchardon's answer的一个小改进。无需转置数据集,而是使用sumall的维度参数。 find是不必要的,而是使用逻辑索引。使用all代替sum会使比较变得不必要。

index =all(AFdata==0,2);
AFdata(index,:) = [];