Julia 中的 For 循环。语法混乱

For loop in Julia. Syntax confusion

我完全是 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 部分。我在这里问的原因是因为我也不知道要 Google 或在 Julia 文档中搜索什么。

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

里面有两个操作你不太清楚:

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