[Matlab] Concatener
Résolu
lazkike
Messages postés
447
Date d'inscription
Statut
Contributeur
Dernière intervention
-
Sacabouffe Messages postés 9427 Date d'inscription Statut Membre Dernière intervention -
Sacabouffe Messages postés 9427 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous
J'ai un soucis de programmation sous matllab.
J'ai une série de N fichiers que j'appelle Spectres et qui contiennent des intensités lumineuses. Ces N spectres je veux les concaténer sous MatLab.
Le petit prog que j'ai écrit arrive à charger les N spectres dans le workspace.
Dans le workspace, ils sont identifiés comme Spec_1, Spec_2 etc... Spec_N.
Après Je veux les concaténer mais je n'y arrive pas.
Mon soucis, je n'arrive pas à trouver la commande qui va réussir à concaténer N spectres horizontalement. J'ai mis en gras la ligne qui me pose problème (Je pense).
Toute aide sera la bienvenue !!!
Merci d'avance
PS: Tous mes fichiers ont les bonnes dimensions pour être concaténés
J'ai un soucis de programmation sous matllab.
J'ai une série de N fichiers que j'appelle Spectres et qui contiennent des intensités lumineuses. Ces N spectres je veux les concaténer sous MatLab.
Le petit prog que j'ai écrit arrive à charger les N spectres dans le workspace.
Dans le workspace, ils sont identifiés comme Spec_1, Spec_2 etc... Spec_N.
Après Je veux les concaténer mais je n'y arrive pas.
Mon soucis, je n'arrive pas à trouver la commande qui va réussir à concaténer N spectres horizontalement. J'ai mis en gras la ligne qui me pose problème (Je pense).
Toute aide sera la bienvenue !!!
Merci d'avance
PS: Tous mes fichiers ont les bonnes dimensions pour être concaténés
function concatener % cette fonction est utiliser pour concaténer plusieurs spectres Raman au % format texte. % nbrspec = nombre de spectres % numfich = numéro du premier fichier clear; nbrspec = 0; numfich = 0; filesave = []; nbrspec = input('Nombre de spectres à concatener qui forcément ont le radical Spec_ ','s'); numfich = input('Quel est le numéro du premier fichier ? ','s'); filesave = input('Nom du fichier à sauvegarder ? ','s'); nbrspec = str2num(nbrspec); numfich = str2num(numfich); for s = numfich : nbrspec + numfich -1 filename=['Spec_',int2str(s)]; eval (['load ', filename, '.txt', ';']) end Spec_concat= horzcat( ['Spec_', num2str(numfich)] : ['Spec_', num2str(nbrspec + numfich -1)]); Spec_concat = Spec_concat'; save([filesave,'.txt'],'Spec_concat','-ASCII','-TABS'); end
A voir également:
- Retour à la ligne matlab
- Retour à la ligne excel formule - Guide
- Partager photos en ligne - Guide
- Notepad++ retour à la ligne ✓ - Forum Bureautique
- Retour à la ligne google sheet - Forum Google Docs
- Retour à la ligne google sheets android ✓ - Forum Google Docs
6 réponses
Merci pour les explications, on ne peut pas faire mieux !
Sauf que j'ai un petit soucis. Mon matlab ne reconnais pas la commande "strtrim". Quand je tape la commande "help strtrim", il ne la trouve pas. C'est peut être un problème de version (6.5.0.180913a R13) ?
Bref, je vais essayer la solution de la boucle que tu proposes en début de ton post.
Une petite précision (car je reste quand même un novice...)
J'ai du mal à saisir quand tu dis
" tu définis une chaîne (Spec_numfich) puis tu la concatènes avec Spec_(numfich+1)"
Si je concatène la chaine de caractère ci-dessus, ça va donner
Spec_numfichSpec(numfich+1)
Ce que je comprends, c'est que je concatène des lettres (et pas les valeurs quelles représentent ?).
Et si je fais un eval sur la chaine de caractère du type
eval (Spec_numfichSpec(numfich+1))
Je vais récupérer toutes mes valeurs concaténées ?
Comme tu peux le voir, je me remue les neurones ...
Merci d'avance pour tes lumières.
Sauf que j'ai un petit soucis. Mon matlab ne reconnais pas la commande "strtrim". Quand je tape la commande "help strtrim", il ne la trouve pas. C'est peut être un problème de version (6.5.0.180913a R13) ?
Bref, je vais essayer la solution de la boucle que tu proposes en début de ton post.
Une petite précision (car je reste quand même un novice...)
J'ai du mal à saisir quand tu dis
" tu définis une chaîne (Spec_numfich) puis tu la concatènes avec Spec_(numfich+1)"
Si je concatène la chaine de caractère ci-dessus, ça va donner
Spec_numfichSpec(numfich+1)
Ce que je comprends, c'est que je concatène des lettres (et pas les valeurs quelles représentent ?).
Et si je fais un eval sur la chaine de caractère du type
eval (Spec_numfichSpec(numfich+1))
Je vais récupérer toutes mes valeurs concaténées ?
Comme tu peux le voir, je me remue les neurones ...
Merci d'avance pour tes lumières.
Salut
Spec_concat = strvcat(strcat(repmat(' Spec_',nbrspec,1),... strtrim(cellstr(num2str((numfich:nbrspec+numfich-1).'))))).'; lenspec=numel(Spec_concat); Spec_concat =['[' reshape(Spec_concat,1,lenspec) '];']; Spec_concat = eval(Spec_concat);Ciao
Rien d'extraordinaire ;-)
T'essayais de concaténer de Spec_numfich jusqu'à Spec_(nbrspec + numfich -1) comme pour un vecteur finalement, avec la même syntaxe que pour (numfich : nbrspec + numfich -1) mais ça marche pas.
En fait, il fallait écrire dans une chaîne de caractères [ Spec_numfich ... Spec_(nbrspec + numfich -1) ] et dire à Matlab d'évaluer cette expression.
Avec une boucle, ça doit pas être trop dur, tu définis une chaîne (Spec_numfich) puis tu la concatènes avec Spec_(numfich+1), etc, etc... puis tu l'évalues. Mais j'aime bien faire tout en vectoriel alors j'ai bidouillé. En règle général, c'est plus rapide mais pas sûr que ce soit le cas ici.
Pour résumer...
repmat(' Spec_',nbrspec,1) ça donne
Ensuite, quand tu convertis un vecteur colonne de nombres (pour les indices) en chaîne de caractères, il y a des blancs, par exemple, si ton vecteur de nombre va jusqu'à 100, il y aura deux espaces blancs avant le 1, le 2, etc, etc... un espace blanc devant le 10, le 11, etc...
On obtient alors des cellules contenant toutes les lignes des chaînes de caractères. La fonction strtrim marche alors cellule par cellule, aucun souci...
On concatène ensuite les ' Spec_' avec chaque nombre (strvcat(strcat(repmat(' Spec_',nbrspec,1),strtrim(cellstr(num2str((numfich:nbrspec+numfich-1).'))))))).
D'ailleurs, ça marche alors qu'on concatène un tableau de caractères et des cellules de caractères, Matlab est sympa des fois, ce qui aurait été plus propre aurait été de concaténer des cellules avec des cellules, (strvcat(strcat(cellstr(repmat(' Spec_',nbrspec,1)),strtrim(cellstr(num2str((numfich:nbrspec+numfich-1).'))))))), c'est ce que j'avais fait au début mais j'ai mal recopié, tu pourras remplacer, c'est plus joli :-D
Après on assemble toutes les cellules de caractères par concaténation verticale pour donner un tableau de caractères (strvcat), je voyais pas comment faire directement pour obtenir une concaténation horizontale :-(
strvcat(strcat(repmat(' Spec_',nbrspec,1),strtrim(cellstr(num2str((numfich:nbrspec+numfich-1).')))))
On transpose ce truc parce qu'on va vouloir avoir toutes les chaînes sur une seule ligne, et que quand on redimensionne une matrice, Matlab lit colonne par colonne.
Et voilà... on redimensionne, on a lors la chaîne voulue (sur une ligne : 'Spec_numfich... Spec_(nbrspec+numfich-1)'). Mais il ne s'agit que d'une chaîne de caractères, donc on doit préciser à Matlab de l'évaluer (en rajoutant les [ ] à la chaîne pour la concaténation puis avec le eval).
Voii voilou ;-)
J'espère qu'il y a pas d'erreur, quand je l'ai testé, ça marchait, même avec cette histoire de concaténation d'un tableau et d'un tableau de cellules, j'avais pas fait gaffe.
Bonne nuit
T'essayais de concaténer de Spec_numfich jusqu'à Spec_(nbrspec + numfich -1) comme pour un vecteur finalement, avec la même syntaxe que pour (numfich : nbrspec + numfich -1) mais ça marche pas.
En fait, il fallait écrire dans une chaîne de caractères [ Spec_numfich ... Spec_(nbrspec + numfich -1) ] et dire à Matlab d'évaluer cette expression.
Avec une boucle, ça doit pas être trop dur, tu définis une chaîne (Spec_numfich) puis tu la concatènes avec Spec_(numfich+1), etc, etc... puis tu l'évalues. Mais j'aime bien faire tout en vectoriel alors j'ai bidouillé. En règle général, c'est plus rapide mais pas sûr que ce soit le cas ici.
Pour résumer...
repmat(' Spec_',nbrspec,1) ça donne
Spec_ Spec_ Spec_ ...Avec un espace au début, sinon, après avoir combiné avec les indices, il y aura pas d'espace : Spec_1Spec_2Spec_3 par exemple.
Ensuite, quand tu convertis un vecteur colonne de nombres (pour les indices) en chaîne de caractères, il y a des blancs, par exemple, si ton vecteur de nombre va jusqu'à 100, il y aura deux espaces blancs avant le 1, le 2, etc, etc... un espace blanc devant le 10, le 11, etc...
1 2 ... 10 11 ... 100Pour enlever tous les espaces blancs, j'ai pas eu d'autre idées que d'associer ces lignes de chaînes de caractères (num2str((numfich:nbrspec+numfich-1).')) à des cellules (cellstr(num2str((numfich:nbrspec+numfich-1).'))) car en essayant d'enlever les blancs de l'ensemble de lignes, ça allait pas.
On obtient alors des cellules contenant toutes les lignes des chaînes de caractères. La fonction strtrim marche alors cellule par cellule, aucun souci...
On concatène ensuite les ' Spec_' avec chaque nombre (strvcat(strcat(repmat(' Spec_',nbrspec,1),strtrim(cellstr(num2str((numfich:nbrspec+numfich-1).'))))))).
D'ailleurs, ça marche alors qu'on concatène un tableau de caractères et des cellules de caractères, Matlab est sympa des fois, ce qui aurait été plus propre aurait été de concaténer des cellules avec des cellules, (strvcat(strcat(cellstr(repmat(' Spec_',nbrspec,1)),strtrim(cellstr(num2str((numfich:nbrspec+numfich-1).'))))))), c'est ce que j'avais fait au début mais j'ai mal recopié, tu pourras remplacer, c'est plus joli :-D
Après on assemble toutes les cellules de caractères par concaténation verticale pour donner un tableau de caractères (strvcat), je voyais pas comment faire directement pour obtenir une concaténation horizontale :-(
strvcat(strcat(repmat(' Spec_',nbrspec,1),strtrim(cellstr(num2str((numfich:nbrspec+numfich-1).')))))
On transpose ce truc parce qu'on va vouloir avoir toutes les chaînes sur une seule ligne, et que quand on redimensionne une matrice, Matlab lit colonne par colonne.
Et voilà... on redimensionne, on a lors la chaîne voulue (sur une ligne : 'Spec_numfich... Spec_(nbrspec+numfich-1)'). Mais il ne s'agit que d'une chaîne de caractères, donc on doit préciser à Matlab de l'évaluer (en rajoutant les [ ] à la chaîne pour la concaténation puis avec le eval).
Voii voilou ;-)
J'espère qu'il y a pas d'erreur, quand je l'ai testé, ça marchait, même avec cette histoire de concaténation d'un tableau et d'un tableau de cellules, j'avais pas fait gaffe.
Bonne nuit
A force de me gratter la tête je vais devenir chauve lol !
Mais ça y est j'ai réussi à faire ce que je voulais, mouaarrrrrrrr !!!!!
La méthode n'est pas très sexy mais bon....
J'ai fait une boucle toute bête (en gras)
function concatener
% cette fonction est utilisée pour concaténer plusieurs spectres Raman au
% format texte ayant un nom de fichier spécifique "Spec_"
% nbrspec = nombre de spectres
% numfich = numéro du premier fichier
clear;
nbrspec = 0;
numfich = 0;
filesave = [];
nbrspec = input('Nombre de spectres à concaténer qui ont forcément le radical Spec_ ','s');
numfich = input('Quel est le numéro du premier fichier ? ','s');
filesave = input('Nom du fichier à sauvegarder ? ','s');
nbrspec = str2num(nbrspec);
numfich = str2num(numfich);
for s = numfich : nbrspec + numfich -1
filename=['Spec_',int2str(s)];
eval (['load ', filename, '.txt', ';'])
end
Spec_concat = eval(['Spec_',int2str(numfich)]);
for s = numfich+1 : nbrspec + numfich -1
filename = eval(['Spec_',int2str(s)]);
Spec_concat = [Spec_concat, filename];
end
Spec_concat = Spec_concat';
save([filesave,'.txt'],'Spec_concat','-ASCII','-TABS');
end
Mais ça y est j'ai réussi à faire ce que je voulais, mouaarrrrrrrr !!!!!
La méthode n'est pas très sexy mais bon....
J'ai fait une boucle toute bête (en gras)
function concatener
% cette fonction est utilisée pour concaténer plusieurs spectres Raman au
% format texte ayant un nom de fichier spécifique "Spec_"
% nbrspec = nombre de spectres
% numfich = numéro du premier fichier
clear;
nbrspec = 0;
numfich = 0;
filesave = [];
nbrspec = input('Nombre de spectres à concaténer qui ont forcément le radical Spec_ ','s');
numfich = input('Quel est le numéro du premier fichier ? ','s');
filesave = input('Nom du fichier à sauvegarder ? ','s');
nbrspec = str2num(nbrspec);
numfich = str2num(numfich);
for s = numfich : nbrspec + numfich -1
filename=['Spec_',int2str(s)];
eval (['load ', filename, '.txt', ';'])
end
Spec_concat = eval(['Spec_',int2str(numfich)]);
for s = numfich+1 : nbrspec + numfich -1
filename = eval(['Spec_',int2str(s)]);
Spec_concat = [Spec_concat, filename];
end
Spec_concat = Spec_concat';
save([filesave,'.txt'],'Spec_concat','-ASCII','-TABS');
end
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut
Ah ben cool, t'as réussi finalement :-D
T'inquiète, ici une boucle convient très bien.
Sinon pour répondre à tes questions concernant strtrim, essaie ce que j'avais mis en le remplaçant par deblank, je sais pas si celui-ci existe sous ta version de Matlab.
En fait le strtrim est pas vraiment utile en fait, il enlève les blancs en début et en fin de haîne de caractères. Mais dans ce que je t'avais donné, il y a des blancs qu'en début de chaîne. deblank enlève justement les blancs en début de chaîne, donc il convient très bien ici.
Tu me diras s'il est implémenté sous ta version ?
Sinon, t'aurais pu faire une boucle pour concaténer tous les 'Spec_...' (en tant que chaîne de caractères) et évaluer cette chaîne ensuite.
Et donc pour te répondre à nouveau, ça aurait donné un truc du genre :
Ah ben cool, t'as réussi finalement :-D
T'inquiète, ici une boucle convient très bien.
Sinon pour répondre à tes questions concernant strtrim, essaie ce que j'avais mis en le remplaçant par deblank, je sais pas si celui-ci existe sous ta version de Matlab.
En fait le strtrim est pas vraiment utile en fait, il enlève les blancs en début et en fin de haîne de caractères. Mais dans ce que je t'avais donné, il y a des blancs qu'en début de chaîne. deblank enlève justement les blancs en début de chaîne, donc il convient très bien ici.
Tu me diras s'il est implémenté sous ta version ?
Sinon, t'aurais pu faire une boucle pour concaténer tous les 'Spec_...' (en tant que chaîne de caractères) et évaluer cette chaîne ensuite.
Et donc pour te répondre à nouveau, ça aurait donné un truc du genre :
%% On concatène toutes les chaînes 'Spec_...' %% en mettant un espace blanc entre chaque %% Pour expliquer supposons que numfich = 5 et nbrspec = 19 %% c'est-dire qu'on concatène ' Spec_5' ' Spec_6' ... ' Spec_23' Spec_concat = ''; for s = numfich : nbrspec + numfich -1 Spec_concat = [Spec_concat ' Spec_' num2str(s)]; % mettre un blanc avant Spec_ % sinon tout sera collé end %% On a alors la chaîne ' Spec_5 Spec_6 .... Spec_23' %% Pour l'évaluer comme une expression vectorielle, on rajoute les [ ] dans la chaîne Spec_concat = [ '[' Spec_concat ']' ]; %% Maintenant on a la chaîne '[ Spec_5 Spec_6 .... Spec_23]' %% Pour Matlab, il ne s'agit que d'une chaîne de caractères, donc il faut lui dire de l'évaluer %% Comme si on la tapait dans le workspace... Spec_concat = eval(Spec_concat); %% Maintenant Spec_concat est une matriceCiao
Un grand merci pour les explications car elles vont forcément me servir !!!
Sinon la commande deblank est bien implantée dans ma version.
ça fonctionne en remplaçant strtrim par deblank dans la version du postN°1.
Un grand merci !
J'adore quand une mission se déroule sans accrocs :-D !
Sinon la commande deblank est bien implantée dans ma version.
ça fonctionne en remplaçant strtrim par deblank dans la version du postN°1.
Un grand merci !
J'adore quand une mission se déroule sans accrocs :-D !