使用Parfor将一个4D矩阵分割成几个3D矩阵

4次浏览(最近30天)
菲利普Heinirch
菲利普Heinirch 2018年9月4日
编辑: 斯蒂芬。 2018年9月4日
嘿,
所以我要改变我当前的代码:
i = 1: d (4)
save_file_name = sprintf (“layer_ % i.mat”,我);%保存文件的名称
variable_name = sprintf (“layer_ %我”,我);%变量名
reduced_dimension =挤压(reducedData(::,:,我));%将矩阵的大小减少到3
eval ([“layer_”num2str(我)“= reduced_dimension;”]);%重命名变量
保存(save_file_name variable_name);%保存文件
eval ([“清楚”“layer_”num2str(我)))
结束
这个代码应该分割一个巨大的4D矩阵成几个较小的3D矩阵,同时自动重命名和分别保存它们。我知道使用eval被认为是不好的,但到目前为止我还没有找到任何其他的解决方案。
我想通过使用parfor循环来加速整个过程,但显然“eval”和“save”在这种循环中是不允许的。有谁知道如何解决这类问题吗?
2的评论
斯蒂芬。
斯蒂芬。 2018年9月4日
“使用Parfor将一个4D矩阵分割成几个3D矩阵”
您已经可以使用索引来非常有效地访问4D数组中的数据(索引是 非常 有效)。相反,你要做的是 eval 只会迫使你编写缓慢、复杂、有bug的代码。例如,通过使用 eval 你删除了任何MATLAB JIT引擎加速你的代码的能力,所以你自动地迫使你的代码变得毫无意义的慢,所有的时间:
如果你使用简单的索引,MATLAB会自动加速你的代码。
我想通过使用parfor循环来加速整个过程,但显然“eval”和“save”不允许在这种循环中使用。
如果你打算写快速高效的代码(这通常是初学者开始谈论的事情) parfor ),那么你的方法就完全错了。如果你真的想写高效的代码:
  • 不要在内存中重复不必要的数据。
  • 不要使用eval或者其他任何东西来神奇地访问变量名。
  • 遵循MATLAB文档中的指导方针:

登录评论。

答案(2)

提多Edelhofer
提多Edelhofer 2018年9月4日
你好,
我同意OCDER: parfor只会做大量的内存移动,从客户端到工人,但我怀疑你会得到很多加速。
如果“save”确实太慢,您可以尝试不压缩的保存:在保存时使用“-v6”作为标志。这样一来,文件可能会大得多,但通常保存起来更快。
顺便说一下,如果你有了文件名和层号,为什么要操心变量名是什么呢?为什么不简单地使用“图层”的所有?
提图斯

斯蒂芬。
斯蒂芬。 2018年9月4日
编辑:斯蒂芬。 2018年9月4日
首先,重要的是要注意处理的顺序 .mat 文件是 当每个文件中的变量名完全相同时,会更简单。这适用于读和写它们。然后你可以简单地这样做:
片= 1:d (4)
文件= sprintf (“layer_ % d.mat”、片);
data =挤压(reducedData (:,:,:, slice));
保存(文件,“数据”“切”
结束
注意我写的代码比你的问题更简单,更高效,而且我保存了 也有价值,所以当你 负载 这些数据:
S =负载(...
S.slice
S.data
写得更简单,读得更简单,效率更高:为什么要浪费时间去争呢 eval
如果你真的想要有很多有编号的变量(这是糟糕的数据设计和糟糕的代码的标志),那么你可以将数据分割成结构的字段 保存 这个结构使用 “结构” 选择。但当然,这将是缓慢的,复杂的,不推荐。

下载188bet金宝搏


释放

R2017b

社区寻宝

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

开始狩猎!