4

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

结果:

新A =

 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
4

2 回答 2

3

我知道这个问题已经被标记为已接受,但是,我认为值得指出的是,如果(时间序列中的观察数)远大于(滞后数,则当前接受的答案将非常低效,即在OP的符号中)。这是因为它创建了一个by矩阵,然后将其截断为by 。TKinp_neurTTTK

我会提出两种可能的替代方案。第一个使用计量经济学工具箱中的一个功能,旨在完全满足 OP 的需求:lagmatrix. 第二个是基于循环的解决方案。

lagmatrix解决方案返回NaNOP 想要的位置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
于 2012-12-19T04:35:20.640 回答
2

这是两个班轮:

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