動機
當我們需要把矩陣中的每一個元素都送進一個實數到實數的函數時,應該避免使用 for loop。我們可以使用簡單的技巧來達到我們的目的,例如:
(x .^ 2) .* double(x > 0)
運算時 MATLAB 會做平行化的動作,但這樣的方法不是很理想。
MATLAB 提供了 arrayfun,我們可以定義單變數的實數函數,並且讓 MATLAB 改成矩陣函數,其中矩陣的每一個元素都是藉由帶入單變數實數函數得來,這樣可以使程式碼更容易閱讀,速度似乎也比較快。
使用範例
定義函數
function y = fun(x)
if x > 0
y = x^2;
else
y = 0;
end
主程式
x = randn(1000, 1000, 'gpuArray');
f = @() (x .^ 2) .* double(x > 0);
g = @() arrayfun(@fun, x);
[timeit(f), timeit(g)]
確認兩個函數產生的結果是一樣的
norm((x .^ 2) .* double(x > 0) - arrayfun(@fun, x), 'fro')