For loop 茱莉亚的循环。语法混乱

For loop 茱莉亚的循环。语法混乱,for-loop,syntax,julia,For Loop,Syntax,Julia,我完全不懂朱莉娅和它的语法。我正试图跟随关于朱莉娅的半定规划的文章 如果有人能帮我弄清楚[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部分。

我完全不懂朱莉娅和它的语法。我正试图跟随关于朱莉娅的半定规划的文章

如果有人能帮我弄清楚[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文档中搜索什么。

(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=零点(3,3)< /代码>。您可以使用数组切片操作符(类似于numpy或Matlab)选择整个第二列作为:
    a[1:end,2]
    。但是,当选择从开始到结束的所有内容时,可以忽略这两个值,因此您可以编写
    a[:,2]
    (对于我来说,这总是最容易记住的方法)
  • (点)运算符。茱莉亚对矢量化和非矢量化的内容非常谨慎。在numpy或R中,矢量化操作总是自动进行的。在朱莉娅身上,你拥有控制权——但随着控制权而来的是责任。因此,试图通过写入
    a[:,2]=5.0
    来为第二列赋值将抛出一个错误,因为右边有向量,左边有标量。如果你想矢量化,你需要告诉朱莉娅。因此,点运算符
    =
    意味着“执行元素赋值”。请注意,任何Julia函数或运算符,甚至您自己的函数都可以通过这样的点来修饰。由于这是一个非常重要的语言特性,请看

阵列内访问本身意味着整个轴。逗号后面的部分是下一个轴,它正在沿着该轴建立一个范围。很抱歉,这是一个愚蠢的评论,你的意思是矩阵列?列只是矩阵中的一个轴(具有2维数组),你可以在Julia中通过用逗号分隔多个轴来指定访问。如果你对numpy很熟悉,那也是一样的。非常感谢。事实上,这看起来像是numpy或panda,但我不理解我猜专栏后面的输入。这个循环的目的是填充这个矩阵向量,但是索引对我来说仍然很神秘。高级索引需要一点时间来适应,你会找到的。非常感谢你的回答。虽然我确实理解数组上下文中的切片操作符
,但让我困惑的是,还有第二个
操作符。你说的“第二个”是什么意思?在您的代码中,
始终是关于数组切片的。顺便说一句,试着在Julia控制台中键入
?:
,我指的是上面提到的vin93843的“范围”。
1:10
是Pythons的
范围(1,11)
-仅此而已。在Julia中,这也可以写成
(:)(1,10)
UnitRange(1,10)
。简单地写一个冒号比较短。我明白了。就是这样,第二个
创建范围。这有点让人困惑,因为在编写类似于
a=rand([0:9],2,2)
的东西时,我没有得到一个随机值介于0和9之间的2x2矩阵,而是在这个2x2矩阵中随机放置“0:9”。这是因为
[0:9]
0:9
不同。您应该使用
rand(0:9,2,2)