【问题标题】:Multi-Dimensional Arrays Julia多维数组 Julia
【发布时间】:2017-11-11 22:05:11
【问题描述】:

我是使用 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) 并使用法雷序列对分数进行四舍五入。行中的最后一个数字是两个数字都需要低于的数字。目前,我不是在寻求有关如何解决问题的帮助,而是如何创建一个包含除最后一行 (0) 之外的所有数字的多维数组。我的麻烦是如何在创建数组后将数字放入数组中。

所以我想要 m[0][0] = 58,依此类推。我不确定语法是如何工作的,并且手册令人困惑。希望这是足够的信息。

【问题讨论】:

  • 你需要更具体一点。你想做什么?你在期待什么?与您的预期有何不同?
  • 你是说你无法理解the manual?它的任何特定部分?
  • 数组是1索引的;也许这是你错过的一部分?还有更悠闲的介绍here。
  • 所以即使它输出一个 6x3 数组,它也是 1 索引的?嗯,我会继续看那篇文章。谢谢

标签: arrays multidimensional-array julia


【解决方案1】:

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

不过,这对于教您 Julia 的数组是如何工作的并不是很有帮助。构造像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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多