快速从MATLAB矩阵中删除行和列

时间:2010-11-12 10:50:49

标签: matlab

有没有一种快速的方法可以在MATLAB中从大矩阵中删除行和列?

我有一个非常大的(方形)距离矩阵,我想从中删除多个行/列。

天真:

s = 12000;
D = rand(s);
cols = sort(randsample(s,2))
rows = sort(randsample(s,2)) 

A = D;
tic
A(rows,:) = [];
A(:,cols) = [];
toc
% Elapsed time is 54.982124 seconds.

但这非常缓慢。 奇怪的是, 是<{3}}底部建议的最快解决方案。

可以通过预先分配数组并使用布尔索引

来进行改进
A = zeros(size(D) - [numel(rows) numel(cols)]);
r = true(size(D,1),1);
c = true(size(D,2),1);
r(rows) = false;
c(cols) = false;

tic
A = D(r,c);
toc
% Elapsed time is 20.083072 seconds.

还有更快的方法吗?

2 个答案:

答案 0 :(得分:9)

这似乎是一个内存瓶颈。在我的微型笔记本电脑上,打破D并将这些操作符应用到每个部分要快得多(使用s = 12,000使我的计算机崩溃)。在这里,我将其分为两部分,但您可以找到更优化的分区。

s = 8000;
D = rand(s);

D1 = D(1:s/2,:);
D2 = D((s/2 + 1):end,:);

cols = sort(randsample(s,2));
rows = sort(randsample(s,2));

A1 = D1;
A2 = D2;

tic
A1(rows(rows <= s/2),:) = [];
A2(rows(rows > s/2) - s/2,:) = [];
A1(:,cols) = [];
A2(:,cols) = [];
toc

A = D;
tic
A(rows,:) = [];
A(:,cols) = [];
toc

Elapsed time is 2.317080 seconds.
Elapsed time is 140.771632 seconds.

答案 1 :(得分:0)

我认为这取决于您的使用情况,但我有两个想法:

  1. 使其成为稀疏矩阵。您删除的越多,此选项可能就越好。
  2. 为什么需要删除值?你可能会这样做:
  3. 
    A = D(randsample(s,2), randsample(s,2));
    clear D;
    % Use A