gpt4 book ai didi

julia - 如何快速 reshape 数组

转载 作者:行者123 更新时间:2023-12-03 19:56:51 24 4
gpt4 key购买 nike

在下面的代码中,我使用 Julia Optim 包来查找关于目标函数的最佳矩阵。
不幸的是,提供的优化函数仅支持向量,因此我必须在将矩阵传递给优化函数之前将其转换为向量,并在目标函数中使用它时将其转换回来。

function opt(A0,X)    
I1(A) = sum(maximum(X*A,1))

function transform(A)
# reshape matrix to vector
return reshape(A,prod(size(A)))
end

function transformback(tA)
# reshape vector to matrix
return reshape(tA, size(A0))
end

obj(tA) = -I1(transformback(tA))
result = optimize(obj, transform(A0), method = :nelder_mead)
return transformback(result.minimum)
end

我认为 Julia 每次都为此分配新的空间并且感觉很慢,那么解决这个问题的更有效方法是什么?

最佳答案

只要数组包含被认为是不可变的元素(包括所有原语),那么数组的元素就包含在 1 big 中。连续 一团内存。所以你可以打破维度规则,简单地把一个二维数组当作一维数组,这就是你想要做的。所以你不需要 reshape ,但我不认为 reshape 是你的问题
数组是列主要且连续的
考虑以下函数

function enumerateArray(a)
for i = 1:*(size(a)...)
print(a[i])
end
end
此函数将 的所有维度相乘在一起,然后假设 从 1 循环到该数字是一维的。
当您将 a 定义为以下内容时
julia> a = [ 1 2; 3 4; 5 6]
3x2 Array{Int64,2}:
1 2
3 4
5 6
结果是
julia> enumerateArray(a)
135246
这说明了一些事情。
  • 是的,它确实有效
  • 矩阵以列优先格式存储

  • reshape
    所以,问题是为什么 reshape 不使用这个事实?嗯,确实如此。这是 array.c 中 reshape 的 julia 来源
    a = (jl_array_t*)allocobj((sizeof(jl_array_t) + sizeof(void*) + ndimwords*sizeof(size_t) + 15)&-16);
    所以是的,创建了一个新数组,但只创建了新的维度信息,它指向没有复制的原始数据。您可以像这样简单地验证这一点:
     b = reshape(a,6);

    julia> size(b)
    (6,)

    julia> size(a)
    (3,2)

    julia> b[4]=100
    100

    julia> a
    3x2 Array{Int64,2}:
    1 100
    3 4
    5 6
    所以设置 的第四个元素b 设置 的 (1,2) 元素 .
    至于整体缓慢
    I1(A) = sum(maximum(X*A,1))
    将创建一个新数组。
    您可以使用几个宏来跟踪此问题 @profile @time .时间会另外记录分配的内存量,可以放在任何表达式的前面。
    例如
    julia> A = rand(1000,1000);
    julia> X = rand(1000,1000);
    julia> @time sum(maximum(X*A,1))
    elapsed time: 0.484229671 seconds (8008640 bytes allocated)
    266274.8435928134
    记录的统计数据@profile 使用 输出Profile.print()

    关于julia - 如何快速 reshape 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25949718/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com