質問: a[x,y,z,:][2] end println(b) ``` すべてゼロになってしまいます。 ``` [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] [0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0] ``` この理由はどうしてなのでしょうか。。。? ご教授のほど、お願いいたします。
回答: ``` a = zeros(Float64, 2, 3) a[1,:][2]=3 ``` としたとき何が起きているかというと、`a[1,:][2]=3`の時に、まず`a[1,:]`が計算されて`[0.0 0.0 0.0]`が返ってきます。この値は元の行列を指しているのではなく、新しく作られたコピーです。後半の`[2]=3`の部分は、このコピーに対して実行されるので、元の行列の値は更新されません。 したがって、 ``` b[x0,y,z,:][2] = a[x,y,z,:][1] b[x0,y,z,:][1] = a[x,y,z,:][2] ``` のところを ``` b[x0,y,z,2] = a[x,y,z,1] b[x0,y,z,1] = a[x,y,z,2] ``` とすれば、期待通りに動作すると思います。