2011-03-18 159 views
1

考慮下面的函數,該函數的灰度圖像(2D矩陣)作爲輸入:MATLAB「arrayfun」功能

function r = fun1(img) 
r = sum(sum(img)); 

我想使用arrayfun處理的一系列圖像(3D矩陣)的,從而省去了一個for循環:

arrayfun(@fun1, imgStack); 

但是arrayfun嘗試的imgStack每個元素當作一個輸入來fun1,前面的操作也作爲一個3D矩陣的結果。我如何才能讓arrayfun知道我只想在imgStack的第三維上重複fun1

另一個問題,arrayfun並行調用fun1

+0

(IMG(:))' – Adrien 2011-03-18 12:44:13

回答

5

在這種情況下,你不需要arrayfun執行你的計算,你可以簡單地這樣做:

imgStack = rand(10, 10, 4); % 4 10x10 images 
r = sum(sum(imgStack, 1), 2); % sum along both dimensions 1 and 2 

在一般情況下,大量的MATLAB操作將整個陣列上一次操作的,這就是通常避免循環的方法。

MATLAB的正常「arrayfun」是不平行的。但是,對於GPUArrays(使用並行計算工具箱),有一個並行版本arrayfun

+0

遺憾的混亂,但我的實際功能是遠遠超過「FUN1」,這將影像作爲輸入更復雜,併產生一些結果。大概我可以通過修改函數來避免使用'arrayfun',但由於它是來自工具箱,我想離開函數不變。 – zhanwu 2011-03-18 09:55:32

0

關於你的第一個問題: 你可以試試accumarray。一個建議

function ds = applyfun_onfirstdim(arr, h_fun) 

dimvec = size(arr); 
indexarr = repmat((1:dimvec(1))', [1, dimvec(2:end)]); 

ds = accumarray(indexarr(:), arr(:), [], h_fun); 

這會創建一個與輸入「arr」尺寸相同的輔助索引數組。您要應用h_fun的每個片段都獲得相同的索引編號。在這個例子中,它是第一個。

你可能希望簡化原有的功能,`R =總和