Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 20:48   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 快速从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. 不过,这太慢了。奇怪的是,这 此处底部建议的最快的解决方案。

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

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.

更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 03:31


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.