【问题标题】:Julia - Transform a matrix to a vectorJulia - 将矩阵转换为向量
【发布时间】:2021-04-29 13:50:14
【问题描述】:

除了分配一个新向量并用我的矩阵一个一个地填充它的值,我将如何将大小为n x m 的矩阵调整大小/重新填充为大小为n x m 的向量,概括以下示例:

julia> example_matrix = [i+j for i in 1:3, j in 1:4]
3×4 Array{Int64,2}:
 2  3  4  5
 3  4  5  6
 4  5  6  7

julia> res_vect = [2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7]
12-element Array{Int64,1}:
 2
 3
 4
 3
 4
 5
 4
 5
 6
 5
 6
 7

我的一个想法是:

 res_vect = Int[]
 for j in 1:size(example_matrix,2)
    res_vect = vcat(res_vect, example_matrix[:,j])
 end

我觉得这不是最佳方式,但我无法解释为什么......

【问题讨论】:

  • 顺便说一句,永远不要用res_vect = [] 初始化向量,除非你有很好的理由。 [] 创建一个 Vector{Any},这将毒害您连接它的其他数组。写[] 是性能的巨大红旗。如果您希望数组包含Ints,则应编写Int[]
  • 谢谢@DNF,我不知道 :)

标签: arrays performance matrix vector julia


【解决方案1】:

Julia 允许您在不复制任何数据的情况下执行此类操作:

julia> m = [i+j for i in 1:3, j in 1:4]
3×4 Matrix{Int64}:
 2  3  4  5
 3  4  5  6
 4  5  6  7

julia> m1 = vec(m)  # m1 points to the same memory address as m
12-element Vector{Int64}:
 2
 3
 4
 3
 4
 5
 4
 5
 6
 5
 6
 7

julia> m2 = reshape(m, 4, 3) # m2 still points to the same memory address as m
4×3 Matrix{Int64}:
 2  4  6
 3  5  5
 4  4  6
 3  5  7

如果您想知道“指向相同的内存地址”是什么意思,请查看以下示例:

julia> m2[1,1] = -66         
-66                          
                             
julia> m                     
3×4 Matrix{Int64}:           
 -66  3  4  5                
   3  4  5  6                
   4  5  6  7                

最后,如果在任何时候您确实需要一个副本而不是对相同数据的引用,请使用copy(m) 或@DNF m[:] 的评论(这是一个维度删除运算符,它返回一个带有副本的Vector来自任何Array 的数据)。

【讨论】:

  • 要得到一个向量,使用复制,可以写y = x[:]
  • 哇,我想要的有一个简单的功能!谢谢;)
猜你喜欢
  • 1970-01-01
  • 2021-01-01
  • 2017-06-10
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多