4

水文学的時系列を表す 429x1 ベクトルがあります。時系列を時間ステップで「遅らせる」ことを検討しており、ANN分析のためにnftoolに入力するためのマトリックスに変換します。マトリックスの幅は、入力層の入力ニューロンの量によって制御されます。これは、スプレッド シートから読み取った値です。これは、例を説明するために短い時系列を使用してやりたいことです。

    inp_neur = 5; % amount of input neurons (read in from excel)
A = [9;6;8;3;2]; % hypothetical hydrological time series

% do pad zero process

結果:

newA =

 9     0     0     0     0
 6     9     0     0     0
 8     6     9     0     0
 3     8     6     9     0
 2     3     8     6     9

これは最も難しいことではないと確信していますが、ワンライナーで実行できますか?

どんな助けでも大歓迎です。

乾杯、

JQ

Another example with inp_neur = 7;

A = [11;35;63;21;45;26;29;84;51]

newA =

11  0   0   0   0   0   0
35  11  0   0   0   0   0
63  35  11  0   0   0   0
21  63  35  11  0   0   0
45  21  63  35  11  0   0
26  45  21  63  35  11  0
29  26  45  21  63  35  11
84  29  26  45  21  63  35
51  84  29  26  45  21  63
4

2 に答える 2

3

この質問はすでに承認済みとマークされていることは知っていますが、(T系列の観測数) がK(ラグの数、つまりinp_neur、OP の表記で)。これは、Tby行列を作成してからbyTに切り捨てるためです。TK

2つの可能な代替案を提案します。1 つ目は、OP が必要とすることを正確に実行するように設計された Econometrics ツールボックスの関数を使用しますlagmatrix。2 つ目は、ループ ベースのソリューションです。

ソリューションはOP が必要とする場所にlagmatrix戻るため、それらを変換するには追加の行が必要です。完全な解決策は次のとおりです。NaN0

newA2 = lagmatrix(A, 0:K-1);
newA2(isnan(newA2)) = 0;

ループベースのソリューションは次のとおりです。

newA3 = zeros(T, K);
for k = 1:K
    newA3(k:end, k) = A(1:end-k+1);
end

ループ ベースのソリューションの明らかな利点は、計量経済学ツールボックスを必要としないことです。しかし、それは唯一の利点ですか?タイムランを試してみましょう。設定しT = K = 10ます。それで:

Elapsed time is 0.045809 seconds. %# 3lectrologos solution
Elapsed time is 0.049845 seconds. %# lagmatrix solution
Elapsed time is 0.017340 seconds. %# loop solution

3lectrologos ソリューションとlagmatrixソリューションは本質的に同じです。ループベースのソリューションは 3 倍高速です。ここで、3lectrologos ソリューションの問題を強調するために、 と を設定T = 1000K = 10ます。それで:

Elapsed time is 10.615298 seconds.
Elapsed time is 0.149164 seconds.
Elapsed time is 0.056074 seconds.

現在、3lectrologos ソリューションは、ソリューションよりも 2 桁遅くなりlagmatrixます。しかし、その日の真の勝者は、ソリューションよりも 3 倍高速なループ ベースのlagmatrixソリューションです。

結論:もう Matlab の単一ループを軽視しないでください。彼らは本当に速くなっています!

興味のある方のために、時限実行のコードを以下に示します。

M = 1000; %# Number of iterations for timed test
T = 1000; %# Length of your vector of inputs
K = 10; %# Equivalent to your inp_neur
A = randi(20, T, 1); %# Generate random data

%# 3lectrologos solution (inefficient if T is large relative to K)
tic
for m = 1:M
    tmp = tril(toeplitz(A));
    newA1 = tmp(:, 1:K);
end
toc

%# lagmatrix solution
tic
for m = 1:M
    newA2 = lagmatrix(A, 0:K-1);
    newA2(isnan(newA2)) = 0;
end
toc

%# Loop based solution
tic
for m = 1:M
    newA3 = zeros(T, K);
    for k = 1:K
        newA3(k:end, k) = A(1:end-k+1);
    end
end
toc
于 2012-12-19T04:35:20.640 に答える
2

ここに2つのライナーがあります:

tmp = tril(toeplitz(A));
newA = tmp(:, 1:inp_neur);
于 2012-12-19T01:00:07.887 に答える