我有一个代表水文时间序列的 429x1 向量。我希望将时间序列“滞后”一个时间步长,并将其转换为矩阵以输入 nftool 以进行一些 ANN 分析。矩阵的宽度由输入层中输入神经元的数量控制,这是我从电子表格中读取的值。这就是我想用较短的时间序列来说明示例的方法:

    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

结果:


 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

我敢肯定这不是最难做的事情,但是可以在一个类轮中完成吗?

任何帮助将不胜感激。

干杯,

杰昆
Another example with inp_neur = 7;

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

新A =
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

最佳答案

我知道这个问题已经被标记为已接受,但是,我认为值得指出的是,如果 T(时间序列中的观察次数)远大于 K(滞后数,即 OP 符号中的 inp_neur)。这是因为它通过 T 矩阵创建了一个 T ,然后通过 T 将其截断为 K

我会提出两种可能的选择。第一个使用计量经济学工具箱中的一个函数,旨在完全满足 OP 的要求: lagmatrix 。第二个是基于循环的解决方案。
lagmatrix 解决方案返回 NaN OP 想要的地方 0 ,因此需要额外的行来转换它们。完整的解决方案是:

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 解决方案比 lagmatrix 解决方案慢两个数量级。但当天真正的赢家是基于循环的解决方案,它仍然比 lagmatrix 解决方案快 3 倍。

结论: 不要再轻视 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

关于MATLAB - 创建滞后时间步向量矩阵(类似于填充?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13943964/

10-12 17:16