2012-09-20 108 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