動機

當我們需要把矩陣中的每一個元素都送進一個實數到實數的函數時,應該避免使用 for loop。我們可以使用簡單的技巧來達到我們的目的,例如:

(x .^ 2) .* double(x > 0)

運算時 MATLAB 會做平行化的動作,但這樣的方法不是很理想。

MATLAB 提供了 arrayfun,我們可以定義單變數的實數函數,並且讓 MATLAB 改成矩陣函數,其中矩陣的每一個元素都是藉由帶入單變數實數函數得來,這樣可以使程式碼更容易閱讀,速度似乎也比較快。

另外numpy也有類似的方法

使用範例

定義函數

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')

Reference