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