多维数组朱莉娅

时间:2017-11-11 22:05:11

标签: arrays multidimensional-array julia

我是使用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,等等。我不确定语法是如何工作的,手册令人困惑。希望这是足够的信息。

1 个答案:

答案 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]会返回mr和列c的值。

julia> m[2,3] # second row, third column
23

现在,rc不必是整数 - 它们也可以是整数向量,以选择多行或多列:

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)