我几天前开始学习一点Matlab。
我想绘制一个狄拉克梳状近似,所以我知道一些函数式编程,并且我被告知“你不应该在Matlab中需要for
循环”,我最终得到了这样:
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
,或者这是最好的方式?
答案 0 :(得分: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.'
表示正常转置。特别是在你所拥有的复杂数学的背景下,这非常重要。了解差异,并记住它。