【问题标题】:For loop in Julia. Syntax confusionJulia 中的 for 循环。语法混乱
【发布时间】:2020-12-22 19:06:12
【问题描述】:

我完全是 Julia 及其语法的菜鸟。我正在尝试关注 this Julia 上关于半定性编程的文章。

如果有人可以帮助我弄清楚 In[4] 中的 for 循环实际上做了什么,我将不胜感激:

for i in 1:m
A[:, (i-1)*n+1:i*n] .= random_mat_create(n)
b[i] = tr(A[:, (i-1)*n+1:i*n]*X_test)
end

据我了解,它应该创建一个矩阵向量 A(其中 m 个)以及一个 m 维向量 b。我对A 的索引和b 的索引感到非常困惑。

我想解释一下 :, (i-1)*n+1:i*n 这段代码的一部分。我在这里问的原因是因为我也不知道谷歌或在 Julia 文档中搜索什么。

【问题讨论】:

  • 数组访问中的 : 本身意味着整个轴。逗号后面的部分是下一个轴,它正在沿着该轴构建一个范围。
  • 抱歉这个愚蠢的评论,你的意思是矩阵列?
  • 列只是矩阵中的一个轴(二维数组),您可以在 Julia 中通过用逗号分隔多个轴来指定沿多个轴的访问。如果您熟悉 numpy,则同样适用。
  • 非常感谢。确实,这看起来像 numpy 或 panda,但我不明白我猜的列之后的输入。这个循环的目的是填充这个矩阵向量,但索引对我来说仍然很神秘。
  • 高级索引需要一点时间来适应,你会到达那里的。

标签: for-loop syntax julia


【解决方案1】:

(i-1)*n+1:i*n 创建一个从(i-1)*n + 1 到i*n 的范围。例如,如果i=2 和n=10,则此范围变为11:20,因此A[:, (i-1)*n+1:i*n] 将获取A 的所有行(这就是: 所做的)和第11-20 列.

【讨论】:

  • 我明白了。就是这样,然后第二个: 创建范围。这有点令人困惑,因为在编写a=rand([0:9], 2, 2) 之类的内容时,我没有得到一个随机值介于 0 和 9 之间的 2x2 矩阵,而是在这个 2x2 矩阵中随机放置“0:9”。
  • 那是因为[0:9] 与0:9 不同。你应该使用rand(0:9, 2, 2)。
【解决方案2】:

那里有两个操作你不清楚:

  • : 运营商。考虑Matrixa = zeros(3,3)。您可以使用数组切片运算符(类似于 numpy 或 Matlab)来选择整个第二列:a[1:end,2]。但是,在从开始到@ 987654326中选择一切时,可以省略这两个值,因此您可以在a[:,2](这总是为我记住的最简单的方式)
  • .(点)运算符。 Julia 非常注意什么是矢量化的,什么不是。在 numpy 或 R 中,向量化操作总是自动发生的。在 Julia 中,您拥有控制权 - 但随着控制权而来的是责任。因此,尝试通过编写a[:, 2] = 5.0 将值分配给第二列将引发错误,因为右侧有向量,左侧有标量。如果你想矢量化,你需要告诉 Julia。因此,点运算符.= 的意思是“执行元素赋值”。请注意,任何 Julia 函数或运算符,甚至您自己的函数都可以用这样的点 . 装饰。由于这是一个非常重要的语言功能,请查看https://docs.julialang.org/en/v1/manual/arrays/#Broadcasting

【讨论】:

  • 非常感谢您的回答。虽然我确实理解数组上下文中的切片运算符:,但让我感到困惑的是还有第二个: 运算符。
  • “第二”是什么意思?在您的代码中,: 始终是关于数组切片的。顺便说一句,尝试在 Julia 控制台中输入 ?:
  • 我指的是上面vin93843所说的“范围”。
  • 1:10 是 Python 中的 range(1,11) 等价物——仅此而已。在 Julia 中,这也可以写成 (:)(1,10) 或 UnitRange(1,10)。简单地写一个冒号会更短。
猜你喜欢
  • 2023-01-25
  • 2023-02-02
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 2016-03-11
  • 1970-01-01
相关资源
最近更新 更多