[Matlab] Concatener

Résolu/Fermé
lazkike Messages postés 441 Date d'inscription vendredi 10 septembre 2004 Statut Contributeur Dernière intervention 14 décembre 2013 - 15 déc. 2008 à 16:09
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 - 16 déc. 2008 à 14:24
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
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


6 réponses

lazkike Messages postés 441 Date d'inscription vendredi 10 septembre 2004 Statut Contributeur Dernière intervention 14 décembre 2013 139
16 déc. 2008 à 12:42
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.
4
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
15 déc. 2008 à 17:50
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
0
lazkike Messages postés 441 Date d'inscription vendredi 10 septembre 2004 Statut Contributeur Dernière intervention 14 décembre 2013 139
15 déc. 2008 à 20:29
Merci pour la réponse
Je teste ça demain !
à la vue de la réponse je pouvais me gratter la tête encore longtemps !!
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
15 déc. 2008 à 21:05
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
 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
...
100
Pour 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
0
lazkike Messages postés 441 Date d'inscription vendredi 10 septembre 2004 Statut Contributeur Dernière intervention 14 décembre 2013 139
16 déc. 2008 à 12:48
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



0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
16 déc. 2008 à 13:33
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 :
%% 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 matrice
Ciao
0
lazkike Messages postés 441 Date d'inscription vendredi 10 septembre 2004 Statut Contributeur Dernière intervention 14 décembre 2013 139
16 déc. 2008 à 14:21
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 !
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
16 déc. 2008 à 14:24
De rien ;-)

J'adore quand une mission se déroule sans accrocs :-D !

J'adore quand un plan se déroule sans accrocs :-D !

Il y a quand même eu quelques accrocs dans celui-là. :-(

Allez, ciao !
À la prochaine ! ;-)
0