我有一个代表水文时间序列的 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 = 1000
和 K = 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/