6
votes

Créer des cordes des indices de deux vecteurs dans matlab

J'ai deux vecteurs a et b comme exemple:

a = [1 2 3 4]; b = [5 6 7 8];

Je veux créer des chaînes à partir des indices de A et B : xxx

puis je veux concaténer les chaînes obtenues:

C = CAT (2, C1, C2, C3, C4) = [ 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8];

Je voudrais une solution générale pour m'aider à automatiser cet algorithme.


2 commentaires

A (2): B (2) = [3 4 5 6] ? Vous voulez aussi vraiment des cordes et pas seulement des vecteurs de doubles?


Oui, tu as raison, j'ai fait une édition. J'ai changé quelque chose au début et j'ai oublié de mettre à jour le résultat.


6 Réponses :


1
votes

Essayez quelque chose comme:

A = [1:5; 5:8];, C = [];
for i = A, C = [C i(1):i(2)]; end
Cstr = num2str(C);


0 commentaires

1
votes

Je ferais cela:

a = [1 3 4 5]; b = [5 6 7 8];
c =[];
for i =1:length(a)
    c = [c [a(i):b(i)]];
end
num2str(c)


0 commentaires

1
votes

Tout d'abord, n'attribuez pas de variables comme C1 , c2 , c3 etc., utilise des cellules pour cela.

i "D Utilisez un pour -Loop pour cela, bien qu'il existe probablement une meilleure alternative. xxx

de cette façon tmp TMP stocke vos réseaux séparés, la ligne suivante l'ajoute au tableau C


0 commentaires

5
votes

solution

Cela devrait faire le tour sans utiliser de boucle: xxx


performance

J'ai essayé de faire une comparaison rapide entre cette méthode, La méthode de Luis Mendo et le Pour boucle (voir par exemple Réponse de Visser ). J'ai créé deux tableaux avec des nombres pseudo-aléatoires de 1 à 50 et 501 à 1000 et j'ai programmé le calcul de la taille de la matrice de 1 à 300, sans tenir compte de la conversion de chaîne.

 comparaison de performance

Anwer de Luis Mendo est le gagnant clair, en termes de complexité de temps Arrayfun semble être à pair avec BSXFun . Le pour tarifs de boucle bien pire, à l'exception des très petites tailles de matrices, mais je ne suis pas sûr que le timing peut y faire confiance.

Le code peut être trouvé ici . Je serais très heureux d'obtenir des commentaires, je suis un peu incertain sur ces mesures.


5 commentaires

Merci, je cherchais une telle approche.


Juste pour que vous sachiez, arrayfun est en réalité une boucle de déguisement, même s'il convient sur une ligne mais bien fait de toute façon!


BENOIT_11: La différence de performance cependant est assez drastique, le pour est ~ 20-30 fois plus lent sur ma machine, probablement parce que la matrice résultante ne peut pas être préallocate - je ne suis pas un expert de performance MATLAB bien que...


@dasdingonesin. Généralement, il est préférable d'utiliser TIMIIT Plutôt que TIC / TOC pour un calendrier et une référence précis.


Merci pour l'effort de faire le timing! Comme le dit Hoki, TimeIt est plus précis pour les mesures de temps d'exécution



5
votes

Ceci peut être fait sans boucles (qu'ils pour code>, arayfun code> ou cellfun code>) en utilisant BSXFun Code> Capacité de masquage de BSXFUN . Cela fonctionne également si les "chaînes" ont des longueurs différentes, comme dans l'exemple suivant.

C =
     1     2     3     2     3     4     5     3     4     5     6


0 commentaires

1
votes

juste pour le plaisir: xxx


0 commentaires