【问题标题】:Removing rows and columns from MATLAB matrix quickly从 MATLAB 矩阵中快速删除行和列
【发布时间】:2011-05-09 00:16:15
【问题描述】:

在 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.

不过,这非常慢。 奇怪的是,这底部here建议的最快解决方案。

可以通过预分配数组和使用布尔索引来进行改进

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.

还有更快的方法吗?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    这似乎是一个内存瓶颈。在我微弱的笔记本电脑上,分解 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.
    

    【讨论】:

    • 实际上,当我将拆分和合并放在 tic/toc 中时,它的速度大约是 naive 方法的两倍。
    • 并不奇怪,我应该在时间安排中包括这一步。当您处理数据集时,这种大型性能变得非常依赖机器(也许我应该在更好的东西上对其进行测试)。
    【解决方案2】:

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

    1. 使其成为稀疏矩阵。您删除的越多,此选项可能会越好。
    2. 为什么需要删除这些值?你可以这样做吗:

    
    A = D(randsample(s,2), randsample(s,2));
    clear D;
    % Use A
    

    【讨论】:

    • 问题是矩阵根据定义不是稀疏的。它是一个距离矩阵,因此每个条目[i,j] 是数据集中行ij 之间的距离。另外,我读到 MATLAB 中的稀疏矩阵没有针对行或列操作进行优化,因此可能会更慢。而且我实际上需要删除条目,并且只使用 remaining 条目。
    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多