在一个对象上存储多个矩阵

时间:2017-08-15 14:45:39

标签: julia

我正在尝试在Julia中实施这个简单的计量经济学/统计学练习。我之前从未使用过Julia,而且我已经在R中完成了这个代码,但我似乎无法翻译代码。

这是大纲:我有一个内环,对于固定的N,我从分布中绘制K个样本,然后将它们存储在N×K的矩阵中。我为两个矩阵执行此操作,它们将每个矩阵相乘每个矩阵的列(获得2×1矢量)它们并存储在2×K矩阵中。

之后,我做了一个外部循环,比如5个不同的N值。最后,我希望有5个不同的矩阵,即2 x K,这样我就可以绘制它们。我无法弄清楚的是如何有效地存储这个矩阵。在R中,我只是将它们放在一个列表中,并将它们分别称为计算。

using Distributions
using StatsBase
J = 500
N = [10 100 500 1000 10000]
i = 1
b = ones(3,J)
for n in N
    x = ones(n,J)
    e = ones(n,J)
    y = ones(n,J)
    for j = 1:J
        x[:,j] = rand(Normal(3,1),n)
        y[:,j] = 3 + 2.5*x[:,j] + e[:,j]
        x = [y[:,j] x[:,j]]
        b[:,j] = inv(y'*x)*(x'*y[:,j])
    end
    i = i + 1
    i
end

我已尝试使用此代码,但它似乎根本不起作用。我甚至无法将这个简单的循环用于下面的工作:

for i = 1:10
    x = ones(i, 10)
end

我得到ERROR: UndefVarError: x not defined。你能帮助我吗?

3 个答案:

答案 0 :(得分:3)

你只需将它们放在Vector{Matrix}矩阵向量中。 但朱莉娅的一个常见范例是改为定义一个能够做你想要的函数f,然后在N上广播该函数,即通过调用a = f.(N)(N应该是一个Vector,而不是一个矩阵) ,BTW,数字之间的逗号,而不是空格。)

所以,假设你要存储5个不同K的2 x K矩阵。实际上有很多方法可以做到这一点,这取决于品味,风格,便利性等。以下是一些例子,其中k变化从20到24:

# a python-style list comprehension
mymatrices = [randn(K,2) for K in 20:24]

# a function broadcast over the array
f(k) = randn(k,2)
mymatrices = f.(20:24)

# a Vector with preallocated elements
mymatrices = Vector{Matrix{Float64}}(5)
for (i, k) in enumerate(20:24)   #enumerate is smart
    mymatrices[i] = randn(k, 2)
end    

# a Vector that grows dynamically
mymatrices = Matrix{Float64}[] # shorter optional syntax for an empty vector
for (i, k) in enumerate(20:24)
    push!(mymatrices, randn(k, 2))
end  

# map with an anonymous function
mymatrices = map(k -> randn(k,2), 20:24)

答案 1 :(得分:2)

所以在你们的帮助和更多googleing之后,我想出了这个有效的代码。不确定这是否违反了StackOverflow的目的,但我发布了我的答案。如果你们有时间,请批评,看起来有点过于冗长,我确信有更有效的方法来做到这一点。

using Distributions

N = [10, 100, 500, 1000, 10000]
J = 500
bet = Vector{Matrix{Float64}}()

for n in N
    b = Array{Float64, 2}(3, J)
    for j = 1:J
        x1 = Array{Float64, 2}(n,J)
        x2 = Array{Float64, 2}(n,J)
        epsilon = Array{Float64, 2}(n,J)
        y = Array{Float64, 2}(n,J)
        cons = ones(n)
        x1[:,j] = rand(Normal(3,1),n)
        x2[:,j] = rand(Normal(-1,1),n)
        epsilon[:,j] = rand(Normal(0,1),n)
        y[:,j] = 3 + 2.5*x1[:,j] + 4*x2[:,j] + epsilon[:,j]
        x = [cons x1[:,j] x2[:,j]]
        b[:,j] = inv(x'*x)*(x'*y[:,j])
    end
    push!(bet, b)
end

答案 2 :(得分:1)

循环工作正常,x在内部设置正确,但是一旦循环结束,x超出范围,因此未定义。

julia> for i = 1:10
           x = ones(i, 10)
       end

julia> x
ERROR: UndefVarError: x not defined

如果您先创建它:

julia> x = Array{Float64}(10, 10);

julia> for i = 1:10
           x = ones(i, 10)
       end

julia> x
10×10 Array{Float64,2}:
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0

然后它仍然在范围内。