【问题标题】:Poor performance in matlabmatlab表现不佳
【发布时间】:2021-11-20 04:35:19
【问题描述】:

所以我不得不在 Matlab 中编写一个程序来手动计算两个函数的卷积。我写了这段简单的代码,我知道可能没有那么优化:

syms recP(x);
recP(x) = rectangularPulse(-1,1,x);
syms triP(x);
triP(x) = triangularPulse(-1,1,x);
t = -10:0.1:10;
s1 = -10:0.1:10;
for i = 1:201
    s1(i) = 0;
    for j = t
        s1(i) = s1(i) + ( recP(j) * triP(t(i)-j) );
    end
end
plot(t,s1);

我有一个核心 i7-7700HQ 和 32 GB 的 RAM。 Matlab 存储在我的 HDD 上,而我的 Windows 存储在我的 SSD 上。问题是这个简单的代码至少需要 20 分钟才能运行。我把它放在一个部分中,我不运行整个代码。 Matlab 只占用了我 18% 的 CPU 和 3 GB 的 RAM 来完成这项任务。我认为这可能就足够了,我不知道。但我不认为应该花那么长时间。
我做错什么了吗?我搜索了如何增加Matlab的RAM限制,我发现它没有限制,需要多少。不知道能不能增加它的CPU使用率。
有没有办法让事情变得更快一点?我的作业中有 6 或 7 个这样的 for 循环,如果我运行整个实时脚本,这将需要很长时间。提前感谢您的帮助。
(另外,它突出显示了当前正在运行的那段代码。它是for循环,外面的那个被突出显示)

【问题讨论】:

  • 2 个问题。 1) 卷积在傅立叶空间中进行,速度快。 2)符号数学非常慢。您似乎正在尝试使用符号函数进行数字数学运算,这既令人困惑又低效
  • @AnderBiguri 我刚开始学习 Matlab,这是我的第一个作业,所以我知道我在代码中遇到了一些重大问题,哈哈。感谢您的评论。我会搜索数字数学的东西,我之前在搜索中看到过,但并没有真正关注它们。

标签: performance matlab


【解决方案1】:

就像安德说的,使用 matlab 中的符号工具箱作为最后的手段。此外,在尝试加速 matlab 代码时,请专注于利用 matlab 的矢量化操作。我的意思是 matlab 在执行这样的操作方面非常有效:

y = x.*z;

其中 x 和 z 分别是一些 Nx1 个向量,运算符“.*”称为“点乘法”。这本质上是告诉matlab对 x1*z1, x[2]*z[2] .... x[n]*z[n] 执行乘法并将所有值分配给相应的值在向量 y 中。此外,matlab 中的许多函数都能够接受向量作为输入并对每个元素执行它们的操作,并在每个元素处返回与输出相等大小的向量。您可以通过在其文档中向下滚动到输入和输出部分并检查输入和输出可以采用哪种形式的数组来检查任何给定函数。例如,rectangularPulse 的文档说它可以接受向量作为输入。因此,您可以将内部循环简化为:

s1(i) = s1(i) + ( rectangularPulse(-1,1,t) * triP(t(i)-t) );

总结一下:

  1. 避免使用 matlab 中的符号工具箱,直到您对正在做的事情有更好的把握或绝对必须使用它。
  2. 使用 matlab 处理向量和数组的能力非常好。
  3. 从内到外解构您一次编写一个的任何嵌套循环。通常这会显着加快 matlab 代码的速度,尤其是当您不熟悉编写它时。

看看您是否可以进一步简化代码并摆脱外部循环。

【讨论】:

  • 感谢您的回答,我不知道向量输入。但是您推荐的代码的问题是Matlab说两侧的尺寸不同。第二个被认为是 1x1 的东西吗?
  • 啊,我是匆匆而过,没有注意。本质上,您可以编写: s1(i) = sum( rectanglePulse(-1,1,t) .* triP(t(i)-t) );那应该是正确的。
  • 谢谢,这个改进了很多!我会尝试做更多你提到的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2011-06-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多