Comment générer toutes les paires de deux vecteurs dans MATLAB à l'aide de vectorisées code?
Plus d'une fois maintenant, j'ai besoin de générer de toutes les paires possibles de deux vecteurs dans MATLAB ce que je fais avec des boucles qui prennent juste quelques lignes de code, c'est à dire
vec1 = 1:4;
vec2 = 1:3;
i = 0;
pairs = zeros([4*3 2]);
for val1 = vec1
for val2 = vec2
i = i + 1;
pairs(i,1) = val1;
pairs(i,2) = val2;
end
end
Génère ...
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
4 1
4 2
4 3
Il doit y avoir une meilleure façon de faire ce qui est plus MATLAB'esque?
n.b. nchoosek
ne fait pas de paires inversées ce dont j'ai besoin (c'est à dire 2 1
ainsi que 1 2
), je ne peux pas juste l'inverse et ajouter le nchoosek
sortie parce que le symétrique paires seront inclus deux fois.
Vous devez vous connecter pour publier un commentaire.
Essayer
Voir le MESHGRID documentation. Bien que ce n'est pas exactement ce que la fonction est pour, mais si vous plissez les yeux lors qu'il est drôle, ce que vous demandez est exactement ce qu'il fait.
meshgrid
et serialising de vecteurs 2d, mais n'a jamais envisagé de les utiliser de cette façon.Vous pouvez utiliser
Une autre solution pour collection:
vec1
etvec2
.find
doit toujours être vecteurs colonnes, ainsi quevec1(idx1)
etc.idx1
est un vecteur (n'a pas d'importance si de ligne ou de colonne), sivec1
est un vecteur ligne puisvec1(idx1)
sera également un vecteur ligne. Il en va de même pourvec2
.Vous pourriez le faire en reproduisant les matrices à l'aide de
repmat
, puis en tournant le résultat dans un vecteur colonne à l'aide dereshape
.Bien sûr, vous pouvez vous débarrasser de toutes les variables intermédiaires à partir de l'exemple ci-dessus.
Vous pouvez utiliser le bon vieux opérations matricielles, par exemple, dans
Edit: c'est l'Octave de la syntaxe, MATLAB ressemblera à ceci:
dans les deux cas, le résultat sera
Ici un plus de MATLAB'esque façon de trouver des combinaisons. Celui-ci peut également être facilement étendu à plus de 2 vecteurs (et aussi non-combinaisons numériques):
À partir de la version R2015a, vous pouvez le faire à l'aide de
repelem
etrepmat
:Ce type de solution évite supplémentaires variables intermédiaires requis par certains des autres solutions (comme celles basées sur les
meshgrid
) qui pourrait conduire à des problèmes de mémoire pour les plus grands vecteurs.Ce que vous cherchez est la produit cartésien
cartprod est la fonction qui l'implémente. Vous pouvez le trouver dans le linéaire algèbre paquet de sorte que vous devez faire: