2012-09-20 74 views
1

几天前我开始学习一点Matlab。我应该在Matlab中使用arrayfun吗?

我想绘制狄拉克梳状近似,所以因为我知道有些函数式编程,而且有人告诉我:“你不应该需要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,或者这是最好的方式?

回答

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.'表示正常转置。特别是在像你这样复杂的数学环境中,这非常重要。了解差异,并记住它。

+0

+1这是一个很棒的答案/建议,谢谢!只是为了澄清,当你说'exp(( - M:dx:M)。'* x)' - 那应该是[矩阵指数](http://en.wikipedia.org/wiki/Matrix_exponential ),还是在做别的事情?我从来没有使用过矩阵指数! – Mehrdad

+0

@Mehrdad:不,expm()是矩阵指数。 exp([某个矩阵])只是元素明确的指数。 –

+0

Ahhhh更有意义,我想知道如何做到这一点!谢谢! :) – Mehrdad