这是我与Julia的第30分钟。
目标是找出矩阵的两个对角线的内容(上半部分 - >右下部和右上部 - >左下部)。朱莉娅对我来说是新手,所以我的方法是扭转原来的矩阵'列,以便我可以在两者上使用diag
函数。
以下代码重新排列列。
state = [ 0 1 2; 1 2 0; 0 2 1]
result = zeros(3,3)
for col=[1:3]
result[:, col] = state[:,4-col]
end
我可以确认代码完成了我想要的操作。
> println(state)
[0 1 2
1 2 0
0 2 1]
> println(result)
[2.0 1.0 0.0
0.0 2.0 1.0
1.0 2.0 0.0]
我可以找到我想要的两条对角线。
> println(diag(state))
[0,2,1]
> println(diag(result))
[2.0,2.0,0.0]
感觉我可以通过单行或通过我在文档中找不到的本机函数来执行此操作。列反转的for循环和两个diag调用的使用似乎都在重复我自己一点点。
实现我想要的最好的(pythonic但julathonic)方法是什么?
答案 0 :(得分:3)
这种做法的一种方式是使用理解:
julia> M = randn(5,5)
5x5 Array{Float64,2}:
-0.0560902 -0.949341 -0.525774 -1.46393 -0.30404
-0.409552 1.60397 1.18376 -0.397768 0.37188
0.581681 0.18783 -0.611989 -1.03926 -0.240255
0.0336476 -1.6296 -0.183579 -0.223435 -0.0134303
-0.16528 -0.0928992 0.412221 -1.61453 0.564105
julia> [ M[i,i] for i=1:5 ]
5-element Array{Any,1}:
-0.0560902
1.60397
-0.611989
-0.223435
0.564105
julia> [ M[i,5-i+1] for i=1:5 ]
5-element Array{Any,1}:
-0.30404
-0.397768
-0.611989
-1.6296
-0.16528
在全局范围内,生成任何数组,这不是最佳数组。您可以通过将M
声明为常量来解决此问题:const M = randn(5,5)
。或者,如果理解出现在局部范围内,它们的输入就会很好。