子函数内修改被传递的数组问题

数组的部分被传递给子函数时,如何在子函数内修改被传递的数组的值?
如果我们构建一个数组,将其传递给子函数,在子函数内修改该数组

function fun1(array)
    array = ones(3, 3)
end
function fun2(array)
    for i in 1:3
        for j in 1:3
            array[i, j] = 1.0
        end
    end
end
function fun3(array)
    copyto!(array, ones(3, 3))
end
myArray1 = zeros(3, 3)
myArray2 = zeros(3, 3, 3)

fun1fun2fun3分别作用与myArray1myArray2[1, :, :],其中fun2fun3成功修改了myArray1的值,但没有函数能在传入myArray2[1, :, :]时修改myArray2[1, :, :]的值
所以数组的部分被传递给子函数时,如何在子函数内修改被传递的数组的值?还是只能另辟蹊径?

需要inplace修改,用 .=

1 个赞

!好,fun4都可以修改了,我会用.+不会用.= :woozy_face:

function fun4(array)
    array .= ones(3, 3)
end

今天跑程序出现奇怪的bug,试了一下,又不能修改了吗?

julia> versioninfo()
Julia Version 1.5.3
Commit 788b2c77c1 (2020-11-09 13:37 UTC)
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: Genuine Intel(R) CPU 0000 @ 2.90GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-9.0.1 (ORCJIT, skylake)

julia> myArray2 = zeros(3, 3, 3)
3×3×3 Array{Float64,3}:
[:, :, 1] =
 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

[:, :, 3] =
 0.0  0.0  0.0
 0.0  0.0  0.0
 0.0  0.0  0.0

julia> function fun4(array)
           array .= ones(3, 3)
       end
fun4 (generic function with 1 method)

julia> fun4(myArray2[1, :, :])
3×3 Array{Float64,2}:
 1.0  1.0  1.0
 1.0  1.0  1.0
 1.0  1.0  1.0

julia> myArray2
3×3×3 Array{Float64,3}:
[:, :, 1] =
 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

[:, :, 3] =
 0.0  0.0  0.0
 0.0  0.0  0.0
 0.0  0.0  0.0

索引是会发生copy的,用@view避免copy

1 个赞

数组slice不发生copy是个没法依赖的实现细节。用@view报一下。