向Julia中的DataArray添加列

向Julia中的DataArray添加列,julia,Julia,接下来,我想对DataArray做一些类似的澄清 设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 除非有特殊原

接下来,我想对DataArray做一些类似的澄清

设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

除非有特殊原因,否则我的建议是从
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中,从而在代码上有所改进。例如

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)

谢谢,我在网上看到用@data初始化有时会有问题。什么时候会这样?@merch我不太确定-我不太会使用
@data
宏。我在这里没有遇到任何问题。不过,对于更多的问题,我建议您提出一个新问题,无论是在SO上还是在DataArrays包的github页面上,解决您遇到的初始化问题的细节。不过,作为粗略的第一步,如果您发现问题,可以先初始化为数组,然后转换为DataArray。携带最终不使用的额外列会有什么损失?@PatrickT-Some,但这可能对您有影响,也可能对您没有影响。如果阵列的列数超过您的需要,那么它将占用更多的ram。而且,使用它进行某些计算可能需要更多的时间。但是,如果你在这些方面没有太多的限制,如果额外的列数很小,这应该不是什么大问题。谢谢@MichaelOhlrogge