【问题标题】:Matlab: Can a large number of preallocations be placed in another file?Matlab:可以将大量预分配放在另一个文件中吗?
【发布时间】:2015-03-09 12:05:55
【问题描述】:

我正在编写一个 matlab 代码,其中有很多变量需要预先分配(每个变量都是 8760x1 双倍)。这些值在 for 循环中生成:

a=zeros(8760,1);
b=zeros(8760,1);
(...)
for i=1:8760
a(i)=[some code];
b(i)=[some code];
(...)
end

但是,看到我有很多这些变量,我想在另一个文件中预分配参数(更干净)。

预分配.m

a=zeros(8760,1);
b=zeros(8760,1);
...

main.m

preallocate
for i=1:8760
a(i)=[some code];
b(i)=[some code];
(...)
end

在另一个 matlab 文件中进行预分配是否与在与执行文件相同的文件中进行预分配一样有效?其他建议?

【问题讨论】:

  • 我认为这种方法没有任何问题。为了清晰起见,我经常将我的程序分成几个脚本
  • 至于其他建议:a(8760,1)=0;可能是比a=zeros(8760,1);更快的分配方式
  • @LuisMendo:我们在学校学习基本的 Matlab 时学会了使用 zeros(nRow,nCol) 进行预分配。但是,我看到您的方法更快(至少对于定义矩阵。这两者有什么区别?
  • @ROLF - 这是 Eitan T 的一篇文章,比较了如何使用各种方法初始化零数组:stackoverflow.com/a/14195309/3250829 - 确定zeros(M,N) 有很多不必要的开销。基本上,在最终创建零数组之前会执行许多额外的操作。执行a(8760,1) = 0 已被证明是初始化设置为 0 的内存最快的方法之一。您可以查看该线程,其中答案是更详细的分析。

标签: matlab allocation


【解决方案1】:

是的。

【讨论】:

【解决方案2】:

这是一种有效的方法,但您必须确保您的变量进入主函数的工作区,即您应该设置 preallocate.m 以便:

[a, b] = preallocate

这样当它在主函数中被调用时,你的预分配就会被初始化。

【讨论】:

  • 我的理解是preallocate.m是脚本,不是函数。所以它不会返回任何输出
  • 这可能是,我喜欢使用函数,所以我的回答立即来自我自己的风格:P
  • preallocate.m 是一个脚本,而不是一个函数。使用函数会迫使我定义输入(无)和输出。给定大量变量,输出列表会很长。我不认为将它定义为一个函数对我有什么好处?
  • 这很公平,我的错是我没有接受许多变量请求,脚本离开。
猜你喜欢
  • 2019-08-31
  • 1970-01-01
  • 2013-10-13
  • 2021-10-24
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多