51404


以下の要素の中の要素を空の配列に代入したのですが変化しません。(global宣言してもダメでした)、この理由はなぜなのでしょうか。。  
たとえばxをずらしただけの場合は変化します。

[code]

    a = zeros(Float64,3,3,3,6)
    a[1,2,3,:] =[1 2 3 4 5 6]
    b = zeros(Float64,3,3,3,6)
    for x in 1:3, y in 1:3, z in 1:3
        x0 = ((x-1 + (3-1)) %3) + 1
        b[x0,y,z,:] = a[x,y,z,:]
    end
    println(b)
    
[/code]

結果

[code]

    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 1.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 2.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 3.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 4.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 5.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 6.0 0.0]
    
[/code]

しかし、以下のようにするとうまくいきません。

[code]

    a = zeros(Float64,3,3,3,6)
    a[1,2,3,:] =[1 2 3 4 5 6]
    b = zeros(Float64,3,3,3,6)
    for x in 1:3, y in 1:3, z in 1:3
        x0 = ((x-1 + (3-1)) %3) + 1
        b[x0,y,z,:][2] = a[x,y,z,:][1]
        b[x0,y,z,:][1] = a[x,y,z,:][2]
    end
    println(b)
    
[/code]

すべてゼロになってしまいます。

[code]

    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
    [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]
    
[/code]

この理由はどうしてなのでしょうか。。。？  
ご教授のほど、お願いいたします。


CC BY-SA 4.0
2018-12-20T11:05:27.070
51392
2018-12-21T01:56:20.190
29111
question
julia
空の配列に要素が入っている配列を渡したいがうまくいかない

[code]

    a = zeros(Float64, 2, 3)
    a[1,:][2]=3
    
[/code]

としたとき何が起きているかというと、`a[1,:][2]=3`の時に、まず`a[1,:]`が計算されて`[0.0 0.0
0.0]`が返ってきます。この値は元の行列を指しているのではなく、新しく作られたコピーです。後半の`[2]=3`の部分は、このコピーに対して実行されるので、元の行列の値は更新されません。

したがって、

[code]

    b[x0,y,z,:][2] = a[x,y,z,:][1]
    b[x0,y,z,:][1] = a[x,y,z,:][2]
    
[/code]

のところを

[code]

    b[x0,y,z,2] = a[x,y,z,1]
    b[x0,y,z,1] = a[x,y,z,2]
    
[/code]

とすれば、期待通りに動作すると思います。


CC BY-SA 4.0
2018-12-21T01:56:20.190
51404
2018-12-21T01:56:20.190
3605
51392
answer