|
|
|
|
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
As used to say my friend Angelo, sometimes you need to s.... hard !!!
Configuration: Windows XP Firefox 3.0.4
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
You'd better close your eyes, bow your head
And wait for the ricochet |
Rien d'extraordinaire ;-)
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 You'd better close your eyes, bow your head And wait for the ricochet |
Merci pour les explications, on ne peut pas faire mieux !
|
A force de me gratter la tête je vais devenir chauve lol !
|
Salut
%% 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
You'd better close your eyes, bow your head
And wait for the ricochet
|

