1

matlab での次の問題について、ご協力をお願いします。ベクトルがあり、パーツの開始インデックスと終了インデックスの次の 2 つのベクトルに基づいて、そのパーツを選択したいと思います。

aa = [1   22  41  64  83   105  127  147  170  190  212  233]
bb = [21  40  63  82  104  126  146  169  189  211  232  252]

基本的に、、、 ...V(1:21)でいくつかの機能を実行したいと思います。or whereを試してみましたが、 しか得られません。これは、22 個の要素があるのに比べて 19 個の要素があるためだと思われます。V(22:40)V(233:252)V(aa:bb)V(aa(t):bb(t))t = 1:12V(1:21)V(22:40)V(1:21)

これをプログラミングする高速な方法はありますか?

4

2 に答える 2

1

選択範囲をセル配列に入れ、関数を各セルに適用します。

aa = [1   22  41  64  83   105  127  147  170  190  212  233]
bb = [21  40  63  82  104  126  146  169  189  211  232  252]
V = rand(252,1); % some sample data

selV = arrayfun(@(t) V(aa(t):bb(t)), 1:12,'uniformoutput',false);
result = cellfun(@yourfunction,selV)
% or
result = cellfun(@(selVi) yourfunction(selVi), selV);

適用する関数がすべてのベクトル入力にスカラー出力を持っている場合、これにより 1x12 配列が得られます。関数がベクトル出力を提供する場合は、uniformoutputパラメーターを含める必要があります。

result = cellfun(@(selVi) yourfunction(selVi), selV,'uniformoutput',false);

これにより、1x12 セル配列が得られます。

于 2012-07-23T10:01:10.477 に答える
0

これを非常に凝縮した形式で実行したい場合は、次のように記述できます (わかりやすくするために 2 行で記述します)。

aa = [1   22  41  64  83   105  127  147  170  190  212  233]
bb = [21  40  63  82  104  126  146  169  189  211  232  252]
V = rand(252,1); % some sample data borrowed from @Gunther

%# create an anonymous function that accepts start/end of range as input
myFunctionHandle = @(low,high)someFunction(V(low:high));

%# calculate result
%# if "someFunction" returns a scalar, you can drop the 'Uni',false part
%# from arrayfun
result = arrayfun(myFunctionHandle(low,high),aa,bb,'uni',false)

現時点では、これは明示的なループよりも遅く実行arrayfunされる可能性がありますが、将来のリリースではマルチスレッド化される可能性が高いことに注意してください。

于 2012-07-23T16:42:50.660 に答える