正如@2419所述,
x=[1 2 3 4 5 6]
实际上是一个一行矩阵,而Julia在列向量方面更具性能优势。
话虽如此,当然也有合法的矩阵用途;-)
这就是长篇故事……当您拥有一个矩阵并对其进行切片以使结果成为
单个行时,它会自动转换为列向量:
julia> x = [1 2 3 4; 10 20 30 40; 100 200 300 400]
3×4 Matrix{Int64}:
1 2 3 4
10 20 30 40
100 200 300 400
julia> a = x[2,:]
4-element Vector{Int64}:
10
20
30
40
然而,如果您将其切成2行或更多行,则它仍然是一个矩阵:
julia> b = x[[2,3],:]
2×4 Matrix{Int64}:
10 20 30 40
100 200 300 400
我对这个选择感到有些困惑,但现在就像这样,并且不会改变。请注意,使用第一种情况来检索行向量非常容易:
julia> transpose(a)
1×4 transpose(::Vector{Int64}) with eltype Int64:
10 20 30 40
重要提示!transpose
是一个矩阵操作,仅适用于数值矩阵(或向量)。
如果您的矩阵包含非数值元素,如字符串,则 transpose
将生成错误,并且您应该使用 permutedims
代替:
julia> x2 = [1 2 "c" 4; 10 20 "cc" 40; 100 200 300 "ddd"]
3×4 Matrix{Any}:
1 2 "c" 4
10 20 "cc" 40
100 200 300 "ddd"
julia> a2 = x2[2,:]
4-element Vector{Any}:
10
20
"cc"
40
julia> transpose(a2)
1×4 transpose(::Vector{Any}) with eltype Any:
Error showing value of type LinearAlgebra.Transpose{Any, Vector{Any}}:
ERROR: MethodError: no method matching transpose(::String)
julia> permutedims(a2)
1×4 Matrix{Any}:
10 20 "cc" 40
然而,
transpose
更快:
julia> using BenchmarkTools
julia> @btime transpose(a)
21.971 ns (1 allocation: 16 bytes)
1×4 transpose(::Vector{Int64}) with eltype Int64:
10 20 30 40
julia> @btime permutedims(a)
66.289 ns (2 allocations: 96 bytes)
1×4 Matrix{Int64}:
10 20 30 40
因此,如果您确定您的矩阵是数值型的,请使用transpose
,否则请使用permutedims
。