我是使用Julia的新手,对语言的经验很少。我试图了解多维数组如何在其中工作以及如何在不同维度访问数组。文档让我感到困惑,所以也许这里有人可以更好地解释它。
我创建了一个数组(m = Array {Int64}(6,3))并尝试访问该数组的不同部分。很明显,我理解它是错误的,因此对阵列/多维数组的任何帮助都会有所帮助。
由于
编辑我正在尝试读取包含内容的文件
58 129 10
58 129 7
25 56 10
24 125 25
24 125 15
13 41 10
0
该项目的目的是采用这些分数(58/129)并使用farey序列对分数进行舍入。行中的最后一个数字是两个数字必须在下面的数字。目前,我不是在寻找有关如何解决问题的帮助,而是如何使用除最后一行(0)之外的所有数字创建多维数组。我的麻烦是如何在创建数字后将数字放入数组中。
所以我想m [0] [0] = 58,等等。我不确定语法是如何工作的,手册令人困惑。希望这是足够的信息。
答案 0 :(得分:2)
Julia的数组不是列表列表或指针数组。它们是单个容器,元件排列成矩形。因此,您不会通过重复索引调用(例如m[j][i]
)访问后续维度 - 而是使用一个具有多个索引的索引调用:m[i, j]
。
如果您删除文件中的最后0
,则可以使用内置的readdlm
将该文件加载到矩阵中。我已将前六行复制到剪贴板中,以便在此处更容易理解:
julia> str = clipboard()
"58 129 10\n58 129 7\n25 56 10\n24 125 25\n24 125 15\n13 41 10"
julia> readdlm(IOBuffer(str), Int) # or readdlm("path/to/trimmed/file", Int)
6×3 Array{Int64,2}:
58 129 10
58 129 7
25 56 10
24 125 25
24 125 15
13 41 10
但是,教你如何使用朱莉娅的阵列并不是很有帮助。构造像m = Array{Int64}(6,3)
这样的数组会创建一个未初始化的矩阵,其中18个元素排列为6行3列。如果我们用一种合理的模式填充它,它会更容易看出它是如何工作的:
julia> m .= [10,20,30,40,50,60] .+ [1 2 3]
6×3 Array{Int64,2}:
11 12 13
21 22 23
31 32 33
41 42 43
51 52 53
61 62 63
这已设置数组的值,使其行号位于十位,而列号位于一位。访问m[r,c]
会返回m
行r
和列c
的值。
julia> m[2,3] # second row, third column
23
现在,r
和c
不必是整数 - 它们也可以是整数向量,以选择多行或多列:
julia> m[[2,3,4],[1,2]] # Selects rows 2, 3, and 4 across columns 1 and 2
3×2 Array{Int64,2}:
21 22
31 32
41 42
当然,像2:4
这样的范围只是向量本身,因此您可以更轻松有效地将该示例写为m[2:4, 1:2]
。 :
本身就是其索引的维度内所有索引的向量的简写:
julia> m[1, :] # the first row of all columns
3-element Array{Int64,1}:
11
12
13
julia> m[:, 1] # all rows of the first column
6-element Array{Int64,1}:
11
21
31
41
51
61
最后,请注意Julia的Array
是列专业,并且在内存中连续排列。这意味着,如果您只使用一个索引,例如m[2]
,那么您只需要走下第一列。作为一种特殊的扩展,我们支持通常所说的"线性索引",其中我们允许单个索引跨越更高的维度。所以m[7]
访问第7个连续元素,回绕到第二列的第一行:
julia> m[5],m[6],m[7],m[8]
(51, 61, 12, 22)