假设我有两个向量
x = [1, 2]
和y = [3, 4]
,如何在Julia编程语言中最好地将它们组合成矩阵m = [1 2; 3 4]
?提前感谢您的支持。x = [1, 2]
和y = [3, 4]
,如何在Julia编程语言中最好地将它们组合成矩阵m = [1 2; 3 4]
?提前感谢您的支持。请注意,在 vcat(x', y')
中,操作符 x'
是伴随的,因此如果您使用复数或向量元素而没有定义伴随操作(例如字符串),则不应使用该操作符。因此,应使用 permutedims
,但它会更慢,因为它会分配内存。第三种方法(诚然,它更麻烦)是:
julia> [reshape(x, 1, :); reshape(y, 1, :)]
2×2 Array{Int64,2}:
1 2
3 4
它像[x'; y']
一样不会分配内存,但不会进行递归伴随运算。
编辑:
注:给Cameron的提示:
julia> x = repeat(string.('a':'z'), 10^6);
julia> @btime $x';
1.199 ns (0 allocations: 0 bytes)
julia> @btime reshape($x, 1, :);
36.455 ns (2 allocations: 96 bytes)
reshape
分配的内存很少(需要创建一个数组对象),而 x'
则创建一个不需要分配内存的不可变结构体。
此外,我认为这是一个分配内存的设计决策。至于 isbitsunion
类型,实际上 reshape
返回一个结构体,因此它不会分配内存(类似于范围):
julia> @btime reshape($x, 1, :)
12.211 ns (0 allocations: 0 bytes)
1×2 reshape(::Array{Union{Missing, Int64},1}, 1, 2) with eltype Union{Missing, Int64}:
1 missing
我知道的两种方法:
julia> x = [1,2];
julia> y = [3,4];
julia> vcat(x', y')
2×2 Array{Int64,2}:
1 2
3 4
julia> permutedims(hcat(x, y))
2×2 Array{Int64,2}:
1 2
3 4
还有一种选择-这种方法既适用于数字又适用于其他对象作为String
:
julia> rotl90([y x])
2×2 Array{Int64,2}:
1 2
3 4
rot180
函数的变体;它将图像向左旋转90度。 - Federico Poloni关于什么?
vcat(transpose(x), transpose(y))
或者
[transpose(x); transpose(y)]
x=string.('a':'z'); @btime reshape($x, 1, :);
时,它似乎会分配内存。对于范围,reshape
是不需要分配内存的,但对于数组似乎需要。 - Cameron Bieganekreshape(x, 1, :)
分配内存,但仅最小限度地分配;我认为在大多数情况下差异应该可以忽略不计。 - Bogumił KamińskiPermutedDimsArray
来避免在permutedims
中进行分配。 - Simeon Schaub