我覺得你的代碼已經好矢量(對於n
和m
)。如果你希望這個函數也接受一個數組值rho
/phi
/z
值,我建議你簡單地在for循環中處理值,因爲我懷疑任何進一步的矢量化都會帶來顯着的改進(加上代碼將更難以閱讀)。儘管如此,在下面的代碼中,我試圖通過對BESSELJ和COS函數進行一次調用(我將每個行/矩陣/第三維中的列)。他們的乘法還是done in a loop(ARRAYFUN是精確的):
%# parameters
N = 10; M = 10;
n = 1:N; m = 1:M;
num = 50;
rho = 1:num; phi = 1:num; z = 1:num;
%# straightforward FOR-loop
tic
result1 = zeros(1,num);
for i=1:num
result1(i) = cos(n*z(i)) * besselj(m'-1, n*rho(i)) * cos(m*phi(i))';
end
toc
%# vectorized computation of the components
tic
a = cos(bsxfun(@times, n, permute(z(:),[3 2 1])));
b = besselj(m'-1, reshape(bsxfun(@times,n,rho(:))',[],1)'); %'
b = permute(reshape(b',[length(m) length(n) length(rho)]), [2 1 3]); %'
c = cos(bsxfun(@times, m, permute(phi(:),[3 2 1])));
result2 = arrayfun(@(i) a(:,:,i)*b(:,:,i)*c(:,:,i)', 1:num); %'
toc
%# make sure the two results are the same
assert(isequal(result1,result2))
我沒有使用TIMEIT功能(提供了更多的公平計時)其他基準測試。
0.0062407 # elapsed time (seconds) for the my solution
0.015677 # elapsed time (seconds) for the FOR-loop solution
注意,當你增加輸入向量的大小,這兩種方法會開始有類似的時序(for循環,甚至贏得一些場合)
可以:結果與先前一致你詳細說明每個變量的維度。即'rho'是'1xA'等,以及您期望輸出的尺寸。首先,這有助於我們幫助你,其次,這可以幫助你自己,因爲在使用MATLAB時首先要考慮適當的尺寸。 – Egon