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)
我有一个很大的(正方形)距离矩阵,我想从中删除许多行/列。
天真地:
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)