Julia - 合并向量为矩阵

17
假设我有两个向量x = [1, 2]y = [3, 4],如何在Julia编程语言中最好地将它们组合成矩阵m = [1 2; 3 4]?提前感谢您的支持。
4个回答

13

请注意,在 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

当我执行 x=string.('a':'z'); @btime reshape($x, 1, :); 时,它似乎会分配内存。对于范围,reshape 是不需要分配内存的,但对于数组似乎需要。 - Cameron Bieganek
reshape(x, 1, :) 分配内存,但仅最小限度地分配;我认为在大多数情况下差异应该可以忽略不计。 - Bogumił Kamiński
您也可以使用PermutedDimsArray来避免在 permutedims中进行分配。 - Simeon Schaub
哇 - 很有趣,这样一个基本的问题竟然给出了这么多选项。 - Bogumił Kamiński

8

我知道的两种方法:

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

7

还有一种选择-这种方法既适用于数字适用于其他对象作为String

julia> rotl90([y x])
2×2 Array{Int64,2}:
 1  2
 3  4

4
将来像我一样困惑的读者请注意:该函数并非拼写错误或rot180函数的变体;它将图像向左旋转90度。 - Federico Poloni

7

关于什么?

vcat(transpose(x), transpose(y))

或者

[transpose(x); transpose(y)]

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