朱莉娅 - 将矩阵转换为向量

3

除了分配一个新的向量,并逐个填充它的值以匹配矩阵,我如何将大小为 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

我感觉这还不是最优的方式,但我无法解释为什么...


1
顺便提一下,除非有很好的理由,否则不要使用 res_vect = [] 初始化向量。[] 会创建一个 Vector{Any},这会影响您与其连接的其他数组。写 [] 是性能上的巨大隐患信号。如果您打算让数组包含 Int,则应编写 Int[] - DNF
谢谢 @DNF,我不知道 :) - JKHA
1个回答

7

即使不复制任何数据,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[:](这是一个维度降低运算符,返回任何 Array 中数据的副本的 Vector)。


2
要获取一个向量,可以使用复制,只需编写 y = x[:] - DNF
哇,有一个简单的函数可以满足我的需求!谢谢 ;) - JKHA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接