Supposons que j'ai deux vecteurs x = [1, 2]
et y = [3, 4]
. Comment les combiner au mieux pour obtenir une matrice m = [1 2; 3 4]
dans le langage de programmation Julia? Merci d'avance pour ton soutien.
4 Réponses :
Deux façons dont je connais:
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
Notez que dans vcat(x', y')
l'opération x'
est adjointe donc elle ne doit pas être utilisée si vous travaillez avec des nombres complexes ou des éléments vectoriels qui n'ont pas d'adjoint défini (par exemple des chaînes). Par conséquent, les permutedims
doivent être utilisés, mais ils seront plus lents à mesure qu'ils allouent. Une troisième façon de le faire est (il est vrai que c'est plus compliqué à taper):
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
Il n'est pas alloué comme [x'; y']
mais ne fait pas d'adjoint récursif.
ÉDITER:
Remarque pour 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)
donc reshape
alloue mais seulement de manière minimale (il doit créer un objet tableau, tandis que x'
crée une structure immuable qui ne nécessite pas d'allocation).
Je pense également que c'était une décision de conception à allouer. En ce qui isbitsunion
types isbitsunion
reshape
retourne une structure afin de ne pas allouer (de même que pour les plages):
julia> [reshape(x, 1, :); reshape(y, 1, :)] 2Ã2 Array{Int64,2}: 1 2 3 4
Quand je fais x=string.('a':'z'); @btime reshape($x, 1, :);
il semble allouer. reshape
n'est pas alloué pour les plages, mais il semble allouer pour les tableaux.
reshape(x, 1, :)
alloue, mais seulement de manière minimale; Je dirais que la différence dans la plupart des cas devrait être négligeable.
Vous pouvez également utiliser PermutedDimsArray
pour éviter d'allouer dans permutedims
.
Wow - il est intéressant qu'une question aussi fondamentale donne autant d'options.
Une autre option - celle-ci fonctionne à la fois avec des nombres et d' autres objets en tant que String
s:
julia> rotl90([y x]) 2Ã2 Array{Int64,2}: 1 2 3 4
Note pour les futurs lecteurs confus comme moi: cette fonction n'est pas une faute d'orthographe ou une variante de rot180
; il tourne à l
TEF par 90
degrés.
Qu'en est-il de
[transpose(x); transpose(y)]
ou
vcat(transpose(x), transpose(y))