1

几天前我开始学习一点Matlab。

我想绘制一个类似狄拉克梳子的近似值,所以鉴于我知道一些函数式编程,并且有人告诉我“你不应该for在 Matlab 中需要循环”,我最终得到了这个:

M = 50
dx = 0.1
r = 20
x = -r/dx:r/dx
y = arrayfun(@(k) dx .* sum(exp(-2j * pi * dx * k * (-M:dx:M))), x)

但我觉得arrayfun这不是一个好方法——它只是在 Matlab 中感觉尴尬/矫枉过正。

或者也许只是我,我不知道。
有没有更好的方法来绘制这个图而不诉诸arrayfun,或者这是最好的方法?

4

1 回答 1

2

首先,在命令后面使用分号来抑制输出,这确实会影响性能:

M  = 50;
dx = 0.1;
r  = 20;
x  = -r/dx : r/dx;

然后,点运算符(.*,./等)用于元素操作。你在 arrayfun ( dx .* sum(exp(...))) 中做的乘法是一个标量乘以一个向量。在这种情况下,元素乘法和正常乘法是相同的。保持标量*向量的正常乘法是一个好习惯;它有助于防止错误。

然后,这arrayfun是不必要的。你可以像这样完成同样的事情:

y = dx * sum( exp(-2j*pi*dx * (-M:dx:M).'*x) );

乘积-2j*pi*dx是所有标量之间的乘积。然而,该产品(-M:dx:M).'*x是矩阵之间的产品。由于sum默认情况下对列(维度 1)求和,因此结果是相同的。此解决方案具有较大的内存开销,但arrayfun.

请注意,我已用于.'转置。在 Matlab 中,符号A'表示共轭转置,A.'表示正常转置。尤其是在像你这样复杂的数学背景下,这非常重要。了解其中的差异,并记住它。

于 2012-09-20T04:47:21.157 回答