0

M私は、行が1つの列でソートされた行列を持っています(たとえばc、 )、つまり

M = sortrows(M,c)

行列の各行に関数を適用する必要があります。この関数は、c並べ替えに使用される列の値に依存します。たとえば、 columncが vector の場合、行 1 ~ 3、行 4 ~ 6、および行 7 ~ 11 を引数として[1 1 1 2 2 2 3 3 3 3 3]'呼び出す必要があります。f1f2f3

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

1 に答える 1

4

の行をソートする必要はありませんMaccumarrayカスタム関数を試してください :

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))};
于 2013-07-14T17:12:23.147 に答える