2014-10-01 78 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