【问题标题】:What's the most efficient way to convert a Matrix{T} of size 1*N or N*1 in Julia to a Vector{T}?将 Julia 中大小为 1*N 或 N*1 的 Matrix{T} 转换为 Vector{T} 的最有效方法是什么?
【发布时间】:2013-01-03 11:57:16
【问题描述】:

在 Julia 中将大小为 1*N 或 N*1 的 Matrix{T} 转换为 Vector{T} 的最有效方法是什么?

比如说我有

a = [1,3,5]
b = a'

ab 都是 Array{Int,2} 类型(即Matrix{Int})。将ab 转换为类型Array{Int,1}(即Vector{Int})的最有效方法是什么?

一种方法是:

a_vec = [x::Int for x in a]
b_vec = [x::Int for x in b]

【问题讨论】:

    标签: julia


    【解决方案1】:

    您可以使用vec() 函数。它比列表理解更快,并且随着元素数量的增加而更好地扩展;) 对于 1000x1 的矩阵:

    julia> const a = reshape([1:1000],1000,1);
    
    julia> typeof(a)
    Array{Int64,2}
    
    julia> vec_a = [x::Int for x in a];
    
    julia> typeof(vec_a)
    Array{Int64,1}
    
    julia> vec_aII = vec(a);
    
    julia> typeof(vec_aII)
    Array{Int64,1}
    

    6.41e-6 seconds # 列表理解

    2.92e-7 秒 #vec()

    【讨论】:

    • 关于vecreshape 需要注意的重要一点是,它们与底层数组共享内存以提高性能——这就是为什么vec 比理解要快得多,这会创建一个新数组对象,复制内容。因此,如果您更改a[1]v_aII[1] 也会更改,反之亦然,而v_a[1] 将不受影响。
    【解决方案2】:

    如果矩阵是1xNNx1,我倾向于使用squeeze 来执行此操作:

    squeeze(ones(3, 1))
    squeeze(ones(1, 3))
    

    不确定这是否比使用vecreshape 更有效。

    【讨论】:

    • 好,我不知道这个功能。
    • 从定义中可以看出,squeeze 必须比另一个慢一点。 github.com/JuliaLang/julia/blob/master/base/… 我做了一个小基准测试,我发现:squeeze(m) : ( 2.97 +- 2 ) e-6 seconds vec(m) : ( 2.02 +- 2 ) e-6 seconds reshape(m,length(m )) : ( 1.72 +- 2 ) e-6 seconds 差异非常小,但是根据定义,reshape(m,length(m)) 是更快的选择。
    【解决方案3】:

    vec() 更快

    const a = reshape([1:1000],1000,1);
    @time vec(a);
    elapsed time: 6.914e-6 seconds (184 bytes allocated)
    @time squeeze(a,2);
    elapsed time: 1.0336e-5 seconds (248 bytes allocated)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2019-11-04
      • 2016-03-12
      • 1970-01-01
      相关资源
      最近更新 更多