2

vサイズのベクトルと、長さのベクトルを取り、サイズのベクトルを返す1 x n関数を想定しています。funLp x 1

vvector を取り、長さの各スライディング ウィンドウを関数 fun で処理し、サイズ(または)Lの行列を返すMATLAB 関数はありますか。p x np x (n-L)

これは、ウィンドウ化されたベクトルのマトリックスを作成し、im2colそれらのそれぞれを処理することで実現できることは承知していますが、これは長いベクトルに対してあまりにも多くのメモリを必要としますv

4

2 に答える 2

1

この他の投稿からの同じ解決策が適用される可能性があります(いくつかの変更があります):

n = 7; L = 3;
v = rand(1,n);                        %# 1-by-n vector
M = num2cell(v(hankel(1:L,L:n)),1);   %# sliding windows of length L
fcn = @(x)[min(x);max(x);sum(x)];     %# function that takes a vector of length L
                                      %# and returns a p-by-1 vector (p=3)
%# apply function to sliding windows, result is a p-by-(n-L+1) matrix
M = cell2mat(cellfun(fcn, M, 'UniformOutput',false));
于 2011-11-09T00:54:44.343 に答える
1
funsl=@(is) fun(v(is:is+l-1));
cell2mat(arrayfun(funsl,1:length(v)-l+1,'UniformOutput',false))

ここで行ったのは、固定されたvandlおよび開始インデックス パラメーター ( is) に対して、それぞれのスライスを取得してv適用する無名関数を定義するfunことです。

次に、この関数は、 を介してarrayfun、この開始インデックスのすべての有用な値に適用されます。現時点では私自身がはっきりと名前を付けることができない理由により、各アプリケーションはp x 1ベクトルを返しますが、arrayfunそれを適切なマトリックスに配置することはできません。したがって、UniformOutput=false 設定とそのcell2mat周りの呼び出しです。

編集: 1 行 5 列のベクトルを 4 行 1 列のベクトルに変換する関数でこれをテストするには、使用した

l=5;v=1:12; fun=@(x) cumsum(x(2:end))';

そしてこの結果を得ました:

ans =

 2     3     4     5     6     7     8     9
 5     7     9    11    13    15    17    19
 9    12    15    18    21    24    27    30
14    18    22    26    30    34    38    42

の定義でfunsl vが固定されていることに注意してください。このアプローチを異なるものに適用するには、 (および、これを修正したくない場合は ) をパラメーターとしてv受け取り、上記の 2 行を含み、結果を返す別の関数を作成できます。 2番目のものの。vl

于 2011-11-03T08:40:59.883 に答える