PDA

查看完整版本 : 快速从MATLAB矩阵中删除行和列


poster
2019-12-10, 20:48
有没有一种快速方法可以从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. 不过,这太慢了。奇怪的是,这是 此处 (http://www.mathworks.com/matlabcentral/newsreader/view_thread/153352)底部建议的最快的解决方案。

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

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. 还有更快的方法吗?



回答:

似乎是内存瓶颈。在我笨拙的笔记本电脑上,分解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) - 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.

更多&回答... (https://stackoverflow.com/questions/4163876)