2015-04-20 52 views
2

我在尋找類似於matrix(m, n, f), but for MATLAB rather than MuPAD, and for arrays rather than matrices的東西。也就是說,我在尋找這樣做沒有的(氮高效)的方式for循環:如何通過對每個元素的索引應用一個函數來在MATLAB中創建一個數組?

ret = zeros(m, n); 
for i = 1:m 
    for j = 1:n 
     ret(i, j) = some_function([i, j]); 
    end 
end 
+3

如果您可以修改'some_function()',那麼您可以更改源代碼以使其適用於數組。或者試試http://www.mathworks.com/help/matlab/ref/arrayfun.html – user3528438

+1

好點。對於這個問題,'some_function'已經被矢量化到數組上了嗎?你只需要一種通過'1:m'和'1:n'高效構建'[i,j]'輸入的方法嗎? (例如'[is,js] = ind2sub([m n],1:(m * n))')或者這是關於如何取一個只需要標量輸入的函數並擴展其行爲?這兩種情況的答案完全不同。 –

回答

3

你可以用bsxfun做到這一點,anonymous functions

m = 5; n = 5;      %// matrix size 
f = @(i,j) i*j;     %// anonymous function to apply to each array element 
ret = bsxfun(f,(1:m)',1:n);  %'//apply bsxfun and get output 

輸出例如:

ret = 

    1  2  3  4  5 
    2  4  6  8 10 
    3  6  9 12 15 
    4  8 12 16 20 
    5 10 15 20 25 
+3

+1。應該指出,OP確實說「高效」,並且這個和其他應用技術將執行與循環相同的操作,因爲開銷在重複函數調用本身中。 –

+1

@AndrewJanke我已經運行了一些測試,如果數組相當大('m,n> 1000'),'bsxfun'方法似乎比'for for循環更快。 – eigenchris

+1

@eigenchris我已經注意到了相同的情況,即在最近的MATLAB版本中,即使是使用bsxfun的匿名函數也在追趕內建函數。 – Divakar

相關問題