代码之家  ›  专栏  ›  技术社区  ›  noio

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

  •  17
  • noio  · 技术社区  · 14 年前

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

    还有更快的方法吗?

    2 回复  |  直到 14 年前
        1
  •  9
  •   MarkV    14 年前

    这似乎是一个内存瓶颈。在我那台衰弱的笔记本电脑上,分解并将这些操作程序应用到每个部件上要快得多(使用s=12000会使我的电脑崩溃)。在这里,我将它分成两部分,但您可能会找到一个更优的分区。

    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.
    
        2
  •  0
  •   Xodarap    14 年前

    我想这取决于你的用法,但我有两个主意:

    1. 使其成为稀疏矩阵。你移除的越多,这个选项可能就越好。
    2. 为什么需要删除这些值?你能不能:

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