2016-01-15 106 views
0

我已經搜索過並且有很多這類問題的答案,提示arrayfun,bsxfun等函數。由於尺寸不匹配,我無法解決問題(並且可能是對於MATLAB如何處理匿名函數句柄的根本誤解)。在MATLAB中應用於數組的函數句柄

我有一個以上的變量的通用功能手柄:

f = @(x,y) (some function of x, y) 

啓發式,我想定義就像

g = @(x) sum(f(x,1:3)) 

更確切地說新功能手柄,下面究竟是幹什麼的我需要,但是寫出更大的陣列很麻煩(比如1:10而不是1:3):

g = @(x) f(x,1)+f(x,2)+f(x,3) 

我想是這樣

g = @(x) sum(arrayfun(@(y) f(x,y), 1:3)) 

但爲x的大小超過了1x1的,這並不爲工作不久。

在此先感謝。

+0

這難道不是向量化'F'的選項,因此,它也接受陣列輸入'y'而不只是'x'?否則'x'允許的尺寸是多少? –

+1

我給出的答案是基於提供的有限信息。如果您提供'f'的實現,則可能有更好的解決方案,因爲可能以某種方式矢量化輸出。 – TroyHaskin

回答

2

假如你不能改變的f定義更加向量友好,你可以通過指定non-uniform output和輸出單元陣列轉換成一個矩陣使用最後一種解決方案:

g = @(x) sum(cell2mat(arrayfun(@(y) f(x,y), 1:3,'UniformOutput',false)),2); 

這應該很好地工作如果f(x,y)輸出列向量,並且希望將它們相加在一起。對於行向量,您可以使用

g = @(x) sum(cell2mat(arrayfun(@(y) f(x,y), 1:3,'UniformOutput',false).')); 

如果數組維數更高,我實際上認爲函數累加器會更快更容易。例如,考慮(非常簡單)功能:

function acc = accumfun(f,y) 
    acc = f(y(1)); 
    for k = 2:numel(y) 
     acc = acc + f(y(k)); 
    end 
end 

然後,你可以讓一個班輪

g = @(x) accumfun(@(y) f(x,y),y); 
+0

我正要寫幾乎相同的:)然而:這是否適用於'x'的任何輸入大小?我正在考慮'C = arrayfun(@(y)f(x,y),1:3,'uniformoutput',false); sum(cat(length(size(x))+ 1,C {:}),length(size(x))+ 1)'對於'x'的一般數組,這應該保留形狀。但把它變成一個匿名函數是很麻煩的。 –

+0

@AndrasDeak「x」的形狀應該不重要;只有'f(x,y)'的形狀。由於OP說f(x,1)+ f(x,2)+ f(x,3)有效,所以我認爲輸出數組是足夠正規的,我會看到。 – TroyHaskin

+0

'cell2mat'將連接2d中的單元格,對嗎?儘管'f(x,1)+ f(x,2)'可以用於矩陣值輸出。但我可能是錯的。 –