2013-07-14 111 views
0

我有一個列排序列的矩陣M(比方說c),應用的功能陣列,以矩陣

M = sortrows(M,c) 

我需要一個函數應用於矩陣中的每一行,並且此功能取決於用於排序的列c中的值。例如,如果列c是向量[1 1 1 2 2 2 3 3 3 3 3]',我需要爲行1至3調用f1,將行4至6調用f2,將行7至11作爲參數調用f3

此外,我想調用每個函數,將列c中包含相同值的所有行作爲參數傳遞,以避免在行上使用循環太慢。有一種(非常)快速的方式來做到這一點? (如果排序M沒有必要,它會更好)。

謝謝。

我精確我需要一些代碼(M這裏沒有排序,因爲它似乎沒有必要):

function test 
M=zeros(4,2); 
c=2; 
M(1:2,2)=[3,6]'; 
M(3:5,2)=[1,3,1]'; 
M(6:10,2)=[3,6,1,6,3]'; 

function res = f1(y1,y2) 
res=[1,1,1]; 
end 

function res = f3(y1,y2) 
res=[2,2,2]; 
end 

function res = f6(y1,y2) 
res=[3,3,3]; 
end 

我們:

M = 

0  3 
0  6 
0  1 
0  3 
0  1 
0  3 
0  6 
0  1 
0  6 
0  3 

現在各行會的說法函數fi,i = 1,... n,其中i = c列中的值,即以上例爲例:

f3以行1,4,6,10爲參數,f1以行3, 5,8作爲參數,f6以2,7和9作爲參數。

我該怎麼做,而不使用循環?

回答

4

沒有必要對M的行進行排序。嘗試accumarray使用自定義功能:

F = {@f1, @f2, @f3}; %// Cell array of function handles 
result = accumarray(repmat(M(:, c), size(M, 2), 1), M(:), [], @(x)F{x(1, c)}(x)); 

注意accumarray轉換行組具有相同c值列向量,所以你必須重塑他們回,如果你的函數不能處理這個問題。對於這一點,你可以將它傳遞給accumarray之前定義的組替代的功能:

g = @(x)reshape(x, [], size(M, 2)); 
F = {@(x)f1(g(x)), @(x)f2(g(x)), @(x)f3(g(x))}; 
+0

我不是MATLAB附近的時刻對此進行測試,我希望我的語法正確。 –

+0

謝謝,但我得到一個錯誤:()-indexing必須出現在索引表達式的最後 – Gilbert

+0

我忘了提及,fi必須返回一個向量,而不是標量。準確評論可能嗎? P.S我可以克隆該函數,以便每個克隆都可以返回該向量的每個標量元素,但這意味着將該函數調用的次數與向量的長度一樣多,速度很慢。 – Gilbert