在Julia

时间:2016-09-05 17:18:55

标签: julia

跟进How to add vectors to the columns of some array in Julia?,我想对DataArrays进行一些类似的澄清。

y=randn(100, 2)。我想创建一个矩阵x,其lags > 0的滞后值(y)。我已经编写了一个似乎正常工作的代码(见下文)。我想知道是否有更好的方法来连接DataArray而不是我使用过的方法。

  T, n = size(y);
  x    = @data(zeros(T-lags, 0));

  for lag in 1:lags
    x = hcat(x, y[lags-lag+1:end-lag, :]);
  end

1 个答案:

答案 0 :(得分:3)

除非有特别的理由不这样做,否则我的建议是从您的DataArray x大小开始,然后填写您想要的列值。

这将为您提供比您需要为每个新列重新创建DataArray更好的性能,这就是"添加"的任何方法。列实际上正在做。可以想象,DataArray包可能比你在问题中的语法更漂亮,但从根本上说,这仍然是它将要做的事情。

因此,在您的示例的简化版本中,我建议:

using DataArrays
N = 5; T = 10;
X = @data(zeros(T, N));
initial_data_cols = 2; ## specify how much of the initial data is filled in
lags = size(X,2) - initial_data_cols
X[:,1:initial_data_cols] = rand(size(X,1), initial_data_cols)  ## First two columns of X are fixed in advance


for lag in 1:lags
    X[:,(lag+initial_data_cols)] = rand(size(X,1))
end

如果您发现自己处于需要向已创建的对象添加列的情况,您可以通过首先创建所有新对象然后再添加一个新对象来改进您的代码。到您的初始DataArray。 E.g。

X = @data(zeros(10, 2))
X = [X rand(10,3)]

例如,考虑下面两个例子中执行时间,内存分配数量和数量的差异:

n = 10^5; m = 10;
A = @data rand(n,m);
n_newcol = 10;

function t1(A::Array, n_newcol)
    n = size(A,1)
    for idx = 1:n_newcol
        A = hcat(A, zeros(n))
    end
    return A
end

function t2(A::Array, n_newcol)
    n = size(A,1)
    [A zeros(n, n_newcol)]
end

# Stats after running each function once to compile
@time r1 = t1(A, n_newcol);  ##  0.154082 seconds (124 allocations: 125.888 MB, 75.33% gc time)
@time r2 = t2(A, n_newcol);  ##  0.007981 seconds (9 allocations: 22.889 MB, 31.73% gc time)