我应该在Matlab中使用arrayfun吗?

时间:2012-09-20 04:12:54

标签: matlab

我几天前开始学习一点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,或者这是最好的方式?

1 个答案:

答案 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.'表示正常转置。特别是在你所拥有的复杂数学的背景下,这非常重要。了解差异,并记住它。