2014-10-01 107 views
1

这是我第一次与Julia在30分钟内。逆序排列/诊断矩阵julia

目标是找出矩阵的两个对角线(左上角 - >右下角和右上角 - >左下角)的内容。 Julia对我来说是新手,所以我的方法是颠倒原始矩阵的列,以便我可以在两者上使用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但juliathonic)实现我想要的方式?这样做的

回答

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)。或者,如果理解出现在本地范围内,它们将很好地输入。

+0

列表理解,很好。当我用你的方法颠倒列的顺序时,输出看起来有点不同。 '''A = [0 1 2; 2 2 2; 0 1 2]'''println'''[0 1 2 \ n 2 2 2 \ n 0 1 2]'''while'''M = [A [:,4-i] for i = 1 :3]'''println'''[[2,2,2],[1,2,1],[0,2,0]]'''这两种类型的印刷品是否有区别? – cantdutchthis 2014-10-01 20:59:07

+0

是的,你正在切片,所以你得到一组数组。 – StefanKarpinski 2014-10-02 05:35:53