matlab 性能不佳

III*_*phr 1 performance matlab

所以我必须在 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);
Run Code Online (Sandbox Code Playgroud)

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

dra*_*101 5

就像Ander说的,使用matlab中的符号工具箱作为最后的手段。此外,当尝试加速 matlab 代码时,请重点关注利用 matlab 的矢量化运算。我的意思是,matlab 在执行如下操作时非常高效:

y = x.*z;
Run Code Online (Sandbox Code Playgroud)

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

s1(i) = s1(i) + ( rectangularPulse(-1,1,t) * triP(t(i)-t) );
Run Code Online (Sandbox Code Playgroud)

总结一下:

  1. 避免使用 matlab 中的符号工具箱,除非您能更好地掌握自己正在做的事情,或者您绝对必须使用它。
  2. 利用matlab的能力可以很好地处理向量和数组。
  3. 从内到外解构您一次编写一个的任何嵌套循环。通常这会显着加速 matlab 代码,尤其是当您刚开始编写它时。

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