14
votes

Julia - combinaison de vecteurs dans la matrice

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.


0 commentaires

4 Réponses :


8
votes

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


0 commentaires

10
votes

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


4 commentaires

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.



7
votes

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


1 commentaires

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.



7
votes

Qu'en est-il de

[transpose(x); transpose(y)]

ou

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


0 commentaires