我如何使以下部分的代码没有循环?

1次查看(最近30天)
沙姆西Musayev
沙姆西Musayev 2020年5月13日
评论道: 里克 2020年5月13日
我如何使以下部分的代码没有循环?:
我= 1:n_values
pre_matrix (i, J{我})= 0
结束
J{i}是一个单元格数组,每个单元格包含一些数字,我想改变这些元素在pre_matrix的第i行。每个细胞有不同的数量和大小的细胞是不同的。
Pre_matrix是一个非常庞大的矩阵,因此每次创建矩阵都要花费很长时间。是否有可能在没有for循环的情况下做同样的工作?

接受的答案

凯利卡尼
凯利卡尼 2020年5月13日
我很难找到一个比原始循环更快的解决方案……
生成测试数据
n_values = 10000;
数控= 100;
pre_matrix =兰德(n_values、数控);
深圳=大小(pre_matrix);
J =细胞(1、n_values);
2 = 1: n_values
n0 =兰迪(数控,1);
J{2} =兰迪(数控1 n0);
结束
%原始循环
抽搐
我= 1:n_values
pre_matrix (i, J{我})= 0;
结束
toc
%直接索引,但使用循环获取行索引(Rik的建议)
抽搐
我=细胞(大小(J));
2 = 1: n_values
{二}= ii。*的(大小({2}));
结束
idx = sub2ind(sz, cat(2, I{:}), cat(2, J{:}));
pre_matrix (idx) = 0;
toc
%直接索引,没有显式循环
抽搐
我= cellfun(@(a,b) ones(size(a)))。* b J num2cell (1: n_values),“大学”, 0);
idx = sub2ind(sz, cat(2, I{:}), cat(2, J{:}));
pre_matrix (idx) = 0;
toc
结果:
运行时间为0.017597秒。< -循环
运行时间为0.047797秒。<-循环索引
运行时间为0.119106秒。<- cellfun索引
我猜罪魁祸首可能是循环中缺少的分号?如果你每次迭代都要打印出巨大的矩阵,那肯定需要一些时间!但是循环本身非常快。
2的评论
里克
里克 2020年5月13日
抢手货。我猜这就是为什么你想让mlint给你关于缺少分号的警告。

登录评论。

答案(1)

里克
里克 2020年5月13日
您的问题可能不在于循环本身,而在于对大矩阵的修改。您可能应该生成一个索引列表,并一次性完成修改。
深圳=大小(pre_matrix);
ind_list =细胞(1、n_values);
我= 1:n_values
ind_list{我}= sub2ind(深圳,我*的(大小(J{我})),J{我});
结束
ind_list = cell2mat (ind_list);%未测试代码,检查这一行
pre_matrix (ind_list) = 0;
1评论
沙姆西Musayev
沙姆西Musayev 2020年5月13日
是的,这就是问题所在。对于For循环的每一步矩阵都进行了修改并创建了新的矩阵,因此花费了很长时间。你的代码运行得很好。谢谢:)

登录评论。

标签

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!