Julia 初始化数组以存储对象

Julia 初始化数组以存储对象,julia,Julia,在Julia中,如何初始化数组以存储可变结构?例如: mutable struct Foo func # Some function end function Bar(param1, param2) function nestedFunc(param3) return param3 end return Foo(nestedFunc) end # Initializing with 0s will throw an error when #

在Julia中,如何初始化数组以存储可变结构?例如:

mutable struct Foo
    func # Some function
end

function Bar(param1, param2)
    function nestedFunc(param3)
        return param3
    end

    return Foo(nestedFunc)
end

# Initializing with 0s will throw an error when 
# I attempt to store the struct returned in the Bar call below
arr = zeros(5, 5)    
for i in 1:5
    for j in 1:5
        arr[i, j] = Bar(i, j)
    end
end

我还尝试初始化类型为
Any
的数组,如
arr=array{Any,(5,5)}
,但同样,在设置索引时,我得到类似
ERROR:LoadError:MethodError:no method matching setindex


我该怎么做?我看到的这种行为的基本原理是什么?在Python中,我可以任意初始化列表,并在特定索引中设置我想要的任何内容。

如果将数组初始化为:

arr = Array{Foo,2}(undef,5,5)
在本例中,您正在创建一个数组,其中每个元素都可以是Foo类型,并且具有两个维度。传递给这个“构造函数”的参数是未定义的,这表明所有元素都没有初始化,并且两个维度的大小都是未知的。可以检查节的构造和初始化

如果您正在寻找python列表的灵活性,您可以在其中放置任何类型的对象,您可以这样做

arr = Array{Any,2}(undef,5,5)
在这种情况下,Any指定数组的元素可以是任何类型

但是,您应该知道,如果需要性能,这可能是一种不好的方法,因为数组中的元素类型为“Any”,这会妨碍Julia为数组创建高效的代码。

为什么您的第一个示例不起作用 您正在使用Float64类型的元素创建一个数组,并尝试将函数分配给这些元素。不能动态更改数组的类型。为元素定义了一个类型,这使julia能够有效地将内容保存在内存中,并且允许编译器在对数组执行操作时使用快速函数。看一看

为什么第二个例子不起作用 这是因为您没有为初始值设定项使用正确的形式。正确的形式就是我展示的形式

另外,你确定你能用numpy阵列做到这一点吗

我刚试过

import numpy as np
a = np.zeros(5)
a[0] = 'hello'
得到了一个类似于Julia的类型错误:

ValueError: could not convert string to float: 'hola'

提示:除非你真的必须使用非类型化容器,否则不要使用非类型化容器(通常你几乎从不需要)

下面是正确的方法(为了可读性,我缩短了
条,函数名应该以小写字母开头):

现在呢

julia> myarr = [bar(i,j) for i in 1:3, j in 1:4]
3×4 Array{Foo,2}:
 Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)
 Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)
 Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)
另一个选项(请注意,圆括号
()
构成生成器,点
将赋值运算符矢量化):

和最长选项(注意,容器已键入):


为什么你建议使用
Array{Any,2}
而不是
Array{Foo,2}
?作者的评论是:“在Python中,我可以任意初始化一个NumPy数组,并在一个特定的索引中设置几乎任何我想要的内容。”这让我觉得他想要一个灵活的数组,可以将任何内容推送到该数组中。当然,我可能误解了。我现在修改了答案。小挑剔:python数组没有那么大的灵活性,但是python列表有这么大的灵活性。当然,numpy数组不能做到这一点。你可以用python列表来做,它类似于@ARamirez所说的
Vector{Any}
julia> myarr = [bar(i,j) for i in 1:3, j in 1:4]
3×4 Array{Foo,2}:
 Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)
 Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)
 Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)  Foo(nestedFunc)
myarr2 =Matrix{Foo}(undef,3,4)
myarr2 .= (bar(i,j)  for i=1:3, j=1:4)
myarr3 =Matrix{Foo}(undef,3,4)
for i=1:3, j=1:4
    myarr3 = bar(i,j)
end