IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Concaténation de résultats de boucle [Débutant]


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 9
    Points
    9
    Par défaut Concaténation de résultats de boucle
    Bonjour,

    Ceci est mon premier message sur le forum : je fais face à un problème avec Matlab. Je sais que cela a été maintes fois discuté, mais je ne parviens pas à trouver la bonne méthode.

    Je démarre à partir d'un fichier texte de la forme %s %s %d %d %d %d %d.
    Ces données sont utilisées dans toute une série de calculs à base de boucles.

    Je souhaite, en sortie, obtenir une matrice compilant les résultats d'une boucle.
    Le problème qui se pose est que j'ai texte ET réels dans ma matrice.
    En voici le code de calcul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for k=0:1:length(dem)/3-1;
        i=k+1;
    % construction matrice de resultats avec strings (colonnes 1 et 2)
        assemblage{i, 1} = [Ligne(3*k+1, 1) Classe(3*k+1, 1) date(3*k+1, 1) dem(3*k+1, 1) delta(3*k+1, 1) prix(3*k+1, 1) ddem(3*k+1, 1) ; ...
        Ligne(3*k+1, 1) Classe(3*k+1, 1) date(3*k+1, 1)+1 ddem(3*k+1, 1) DeltaY(i, 1) PrixY(i, 1) optimumY(i, 1) ; ...
        Ligne(3*k+2, 1) Classe(3*k+2, 1) date(3*k+2, 1) dem(3*k+2, 1) delta(3*k+2, 1) prix(3*k+2, 1) ddem(3*k+2, 1) ; ...
        Ligne(3*k+2, 1) Classe(3*k+2, 1) date(3*k+2, 1)+1 ddem(3*k+2, 1) DeltaC(i, 1) PrixC(i, 1) optimumC(i, 1) ; ...    
        Ligne(3*k+3, 1) Classe(3*k+3, 1) date(3*k+3, 1) dem(3*k+3, 1) delta(3*k+3, 1) prix(3*k+3, 1) ddem(3*k+3, 1) ; ...
        Ligne(3*k+3, 1) Classe(3*k+3, 1) date(3*k+3, 1)+1 ddem(3*k+3, 1) DeltaF(i, 1) PrixF(i, 1) optimumF(i, 1) ];
    end
    Tous les indices sont corrects. Pour une valeur de k (et donc de i), la matrice de resultats est correcte, avec texte dans les colonnes 1 et 2, et des réels dans les 5 suivantes.
    La matrice globale dans laquelle j'injecte les trois matrices (k varie de 0 à 2) est déjà allouée en mémoire (matrice vide).
    Je peux donc afficher les matrices résultat une à une, mais ne peux pas les assembler toute ensemble... Je me doute qu'il doit y avoir un problème de conversion de 'cell to double' impossible...

    Je vous remercie par avance de vos lumières.

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    dans quel but essaies-tu de concatener du texte et des valeurs numériques? Quelle utilisation en feras-tu par la suite?


    Lorsque tu exécutes ton code, obtiens-tu un message d'erreur? Si oui, lequel?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Voici quelques explications quant à la raison de ce programme. Il s'agit d'un modèle simpliste d'optimisation de tarification d'une Compagnie aérienne fictive. Une variation de tarification contrôle la demande, et le programme identifie la rentabilité maximale en terme de nombre de sièges, et calcule la tarification à appliquer.
    Les mathématiques, très simples, tournent sans problème. Le 'hic' réside dans le formatage des données de sortie.

    En entrée, un fichier texte avec en-têtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Ligne	Cl.	Jour	DemJ	delta$	$	DemJ+1
    MCO	Y	5	1000	100	600	900
    MCO	C	5	500	100	1600	450
    MCO	F	5	250	100	3100	225
    NCE	Y	5	300	10	110	200
    NCE	C	5	200	10	210	150
    NCE	F	5	100	10	310	75
    CDG	Y	5	500	50	550	400
    CDG	C	5	300	50	1200	280
    CDG	F	5	100	50	1500	95
    Pour chaque destination, trois lignes (trois classes) avec les données.
    Tous les calculs sont effectués en isolant les classes (3k+i). Les données en sortie doivent être formatées de telle manière que les données calculées pour J+1 (en l'occurrence pour le 6 du mois ici) viennent s'intercaler entre les lignes des données d'entrée. Voici l'exemple pour Orlando (MCO).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Ligne	Cl.	Jour	DemJ	delta$	$	DemJ+1
    MCO	Y	5	1000	100	600	900
    MCO	Y	6	900	500	1100	400
    MCO	C	5	500	100	1600	450
    MCO	C	6	450	340	1940	280
    MCO	F	5	250	100	3100	225
    MCO	F	6	225	508	3608	98
    Mon problème réside dans le fait que je ne parviens pas à assembler toutes ces données dans un fichier texte final (chaque boucle étant une destination). Egalement, et je n'ai pas pu encore me pencher dessus, je me demande comment inclure les en-têtes des colonnes dans ce fichier de sortie...

    Encore merci d'avance pour vos conseils...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Salut,

    Tu peux nous montrer comment tu enregistres tes données dans un fichier texte ?

    Si tu fais une recherche sur le forum, tu devrais trouver de bons éléments de réponse.

    Christophe
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Je n'ai pas encore testé l'enregistrement en format texte. Je pense néanmoins utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    save resultats.txt assemblage -ascii;
    Mon problème est que je ne parviens pas à assembler ces blocs de 6 lignes tous ensemble. J'ai du texte dans les deux premières colonnes, et chaque incrément de boucle rajoute 6 lignes. J'ai bien essayé de travailler sur une numérotation de ligne type '6k', mais l'erreur retournée est l'incompatibilité string/integer...

    Je ne sais plus comment tourner la chose.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Bonjour,

    Donc ton idée, si j'ai compris, est de créer sous matlab un "tableau" (avec en-tête, string et integer) pour l'enregistrer directement sous format excel ?

    Si c'est le cas, ce n'est pas nécessaire du tout. Tu peux écrire tes en-têtes dans une variable chaque colonne également comme une variable (tu peux rassembler les string ensembles et les integers ensembles mais ce n'est pas non plus nécessaire). Tout va se passer au moment de créer ton fichier excel où tu peux tout gérer depuis matlab (la feuille, la case de départ, qui va où...)

    Donc à mon avis, ne cherche pas à concaténer...

    Christophe
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Citation Envoyé par christophe_halgand Voir le message
    Donc ton idée, si j'ai compris, est de créer sous matlab un "tableau" (avec en-tête, string et integer) pour l'enregistrer directement sous format excel ?
    Non, ce n'est pas dans cette optique. Je souhaite sortir un fichier '.txt' final.

    Je n'ai pas dû être assez clair, et m'en excuse.

    Pour faire les choses dans l'ordre, voici d'abord le code entier (soyez indulgent quant à sa méthode d'écriture et son optimisation...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    close all;
    clear all;
    format compact;
     
    %% TYPE & CONFIGURATION APPAREILS
    %
    %
    %%%%%%%%%%%
    AC_type = ' B744 ' ; %
    %%%%%%%%%%%
    disp(['Type Appareil :',  AC_type]);
    %%%%%%%
    Yth = 400 ; %
    Cth = 280 ; %
    Fth = 98 ; %
    %%%%%%%
    %
    %
    %% LECTURE DONNEES ENTREE
     
    % A = importdata('data_J.txt');
     
     [Ligne, Classe, date, dem, delta, prix, ddem] = ...
         textread('data_J.txt','%s%s%d%d%d%d%d','headerlines',1);
     
     
    %% CALCUL VARIATION PRIX PAR SIEGE
     
    a = delta ./ (dem - ddem);
    b = (prix - delta) + a .* dem;
     
    % Creation valeurs abscisse pr chque classe
    xY=0:1:Yth;
    xC=0:1:Cth;
    xF=0:1:Fth;
     
    % Calcul des prix par siege correspondant a un nb de sieges
    % Classe Eco (Y)
    for i=1:1:length(dem)/3;
        for j=1:1:length(xY);
            k=0:1:length(dem)/3-1;
            aa = a(3*k+1);
            bb = b(3*k+1);
            Ay(i, j) = -aa(i) .* xY(1, j) + bb(i);
        end
    end
    % Classe Club / Business (C)
    for i=1:1:length(dem)/3;
        for j=1:1:length(xC);
            k=0:1:length(dem)/3-1;
            aa = a(3*k+2);
            bb = b(3*k+2);
            Ac(i, j) = -aa(i) .* xC(1, j) + bb(i);
        end
    end
    % Classe First (F)
    for i=1:1:length(dem)/3;
        for j=1:1:length(xF);
            k=0:1:length(dem)/3-1;
            aa = a(3*k+3);
            bb = b(3*k+3);
            Af(i, j) = -aa(i) .* xF(1, j) + bb(i);
        end
    end
    % hold all;
    % figure(1);
    % % prompt ?????
    %     plot(xY, Ay(1,:), xC, Ac(1,:), xF, Af(1,:));
    %     xlabel('Nb de sieges');
    %     ylabel('Prix par siege ($)');
    % %         title('\a(
    %     legend('Eco', 'Club', 'First');
     
     
    %% CALCUL RENTABILITE
    % en fonction du nb de sieges
    % et du prix calcule par siege
     
    % Classe Eco (Y)
    for i=1:1:length(dem)/3;
        for j=1:1:length(xY);
            epsilonY(i, j) = xY(1, j) .* Ay(i, j);
        end
    end
    % Classe Club / Business (C)
    for i=1:1:length(dem)/3;
        for j=1:1:length(xC);
            epsilonC(i, j) = xC(1, j) .* Ac(i, j);
        end
    end
    % Classe First (F)
    for i=1:1:length(dem)/3;
        for j=1:1:length(xF);
            epsilonF(i, j) = xF(1, j) .* Af(i, j);
        end
    end
     
    %% REPERAGE RENTABILITE MAXIMUM
     
    % Classe Eco (Y)
    for i=1:1:length(dem)/3;
        maxY(i, 1) = max(epsilonY(i, :)); % reperage valeur maximum
        indiceY(i, 1) = find(epsilonY(i, :) == maxY(i, 1)); % determination rang du max ds matrice
        optimumY(i, 1) = xY(1, indiceY(i, 1)); % equivalence nb de siege a partir rang ds matrice
    end
    % Classe Club / Business (C)
    for i=1:1:length(dem)/3;
        maxC(i, 1) = max(epsilonC(i, :));
        indiceC(i, 1) = find(epsilonC(i, :) == maxC(i, 1));
       optimumC(i, 1) = xC(1, indiceC(i, 1));
    end
    % Classe First (F)
    for i=1:1:length(dem)/3;
        maxF(i, 1) = max(epsilonF(i, :));
        indiceF(i, 1) = find(epsilonF(i, :) == maxF(i, 1));
        optimumF(i, 1) = xF(1, indiceF(i, 1));
    end
     
    %% CALCUL NOUVEAUX TARIFS
    % Rappel : a = delta ./ (dem - ddem);
    % Classe Eco (Y)
    for i=1:1:length(dem)/3;
            k=0:1:length(dem)/3-1;
            aa = a(3*k+1);
            demY = ddem(3*k+1);
            DeltaY(i, 1) = aa(i) .* (demY(i) - optimumY(i));
            prixY = prix(3*k+1);
            PrixY(i, 1) = prixY(i) + DeltaY(i);
    end
    % Classe Club / Business (C)
    for i=1:1:length(dem)/3;
            k=0:1:length(dem)/3-1;
            aa = a(3*k+2);
            demC = ddem(3*k+2);
            DeltaC(i, 1) = aa(i) .* (demC(i) - optimumC(i));
            prixC = prix(3*k+2);
            PrixC(i, 1) = prixC(i) + DeltaC(i);
    end
    % Classe First (F)
    for i=1:1:length(dem)/3;
            k=0:1:length(dem)/3-1;
            aa = a(3*k+3);
            demF = ddem(3*k+3);
            DeltaF(i, 1) = aa(i) .* (demF(i) - optimumF(i));
            prixF = prix(3*k+3);
            PrixF(i, 1) = prixF(i) + DeltaF(i);
    end
     
    %% ASSEMBLAGES MATRICE RESULTATS
    data_JJ = zeros(length(dem).*2, 5);
     
    for k=0:1:length(dem)/3-1;
        i=k+1;
    deb=6.*i-5;
    fin=6.*i;
    % construction matrice de resultats avec strings (colonnes 1 et 2)
        assemblage{i, 1} = [Ligne(3*k+1, 1) Classe(3*k+1, 1) date(3*k+1, 1) dem(3*k+1, 1) delta(3*k+1, 1) prix(3*k+1, 1) ddem(3*k+1, 1) ; ...
        Ligne(3*k+1, 1) Classe(3*k+1, 1) date(3*k+1, 1)+1 ddem(3*k+1, 1) DeltaY(i, 1) PrixY(i, 1) optimumY(i, 1) ; ...
        Ligne(3*k+2, 1) Classe(3*k+2, 1) date(3*k+2, 1) dem(3*k+2, 1) delta(3*k+2, 1) prix(3*k+2, 1) ddem(3*k+2, 1) ; ...
        Ligne(3*k+2, 1) Classe(3*k+2, 1) date(3*k+2, 1)+1 ddem(3*k+2, 1) DeltaC(i, 1) PrixC(i, 1) optimumC(i, 1) ; ...    
        Ligne(3*k+3, 1) Classe(3*k+3, 1) date(3*k+3, 1) dem(3*k+3, 1) delta(3*k+3, 1) prix(3*k+3, 1) ddem(3*k+3, 1) ; ...
        Ligne(3*k+3, 1) Classe(3*k+3, 1) date(3*k+3, 1)+1 ddem(3*k+3, 1) DeltaF(i, 1) PrixF(i, 1) optimumF(i, 1) ];
     
    % construction matrice de resultats avec strings only (col 1 et 2) - tentative dépatouillage 1
        assemblageSTR{i, 1} = [Ligne(3*k+1, 1) Classe(3*k+1, 1)  ; ...
        Ligne(3*k+1, 1) Classe(3*k+1, 1) ; ...
        Ligne(3*k+2, 1) Classe(3*k+2, 1) ; ...
        Ligne(3*k+2, 1) Classe(3*k+2, 1) ; ...    
        Ligne(3*k+3, 1) Classe(3*k+3, 1) ; ...
        Ligne(3*k+3, 1) Classe(3*k+3, 1) ];
     
    % construction matrice de resultats sans strings (col 1 et 2) - tentative depatouillage 2
        assemblageNBR = [date(3*k+1, 1) dem(3*k+1, 1) delta(3*k+1, 1) prix(3*k+1, 1) ddem(3*k+1, 1) ; ...
        date(3*k+1, 1)+1 ddem(3*k+1, 1) DeltaY(i, 1) PrixY(i, 1) optimumY(i, 1) ; ...
        date(3*k+2, 1) dem(3*k+2, 1) delta(3*k+2, 1) prix(3*k+2, 1) ddem(3*k+2, 1) ; ...
        date(3*k+2, 1)+1 ddem(3*k+2, 1) DeltaC(i, 1) PrixC(i, 1) optimumC(i, 1) ; ...    
        date(3*k+3, 1) dem(3*k+3, 1) delta(3*k+3, 1) prix(3*k+3, 1) ddem(3*k+3, 1) ; ...
        date(3*k+3, 1)+1 ddem(3*k+3, 1) DeltaF(i, 1) PrixF(i, 1) optimumF(i, 1) ];
    end
    % for i=1:1:length(dem)/3;
        deb=6.*i-5;
        fin=6.*i;
    %     data_JJ(deb, 3) = assemblageNBR{i};
    % end
    C'est dans la toute dernière section (ASSEMBLAGES MATRICE RESULTATS) que j'ajoute tous les résultats de la boucle dans une même matrice. Dans un programme précédent, pour cette même action, j'avais utilisé un repérage des cellules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    % EQUIVALENCES nb/temps
    % remplissage de la matrice 'results'
    for k=1:1:nbComb;
        for l=1:1:length(flt_nb);
            if resultats(k,l) ~= 0; %  NOT zero
               indice = find(resultats(k,l)==tableauvols);
                results(k,l) = duree(indice);
            end
        end
    end
    Seulement, dans ce dernier exemple, chaque résultat de boucle ne comprend que des chiffres et est une ligne unique. J'ai donc essayé d'appliquer cette méthode à mon programme (le tout premier, en haut de ce message), mais pour les raisons expliquées (texte + chiffres, ajout de 6 lignes par incrément de boucle), je n'ai pas pu arriver à un quelconque résultat.

    Le fait de mettre des accolades me renvoie, par contre, TOUS les résultats sous forme de "cell array" (si je ne me trompe pas), mais à partir de là, je suis également incapable de me débrouiller pour arriver à mes fins...

    Une idée de piste à explorer ou de méthode à utiliser ?
    Encore merci.

    Kayou.

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Pourquoi ne pas écrire directement ton fichier texte sans passser par l'étape de concaténation? En utilisant les fonctions fopen, fprintf, fclose?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Je n'y avais pas pensé, n'étant pas familier avec les possibilités multiples de Matlab.
    J'ai donc essayé. Voici la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    for k=0:1:length(dem)/3-1;
        i=k+1;
     
    % construction matrice de resultats avec strings (colonnes 1 et 2)
        assemblage = [Ligne(3*k+1, 1) Classe(3*k+1, 1) date(3*k+1, 1) dem(3*k+1, 1) delta(3*k+1, 1) prix(3*k+1, 1) ddem(3*k+1, 1) ; ...
        Ligne(3*k+1, 1) Classe(3*k+1, 1) date(3*k+1, 1)+1 ddem(3*k+1, 1) DeltaY(i, 1) PrixY(i, 1) optimumY(i, 1) ; ...
        Ligne(3*k+2, 1) Classe(3*k+2, 1) date(3*k+2, 1) dem(3*k+2, 1) delta(3*k+2, 1) prix(3*k+2, 1) ddem(3*k+2, 1) ; ...
        Ligne(3*k+2, 1) Classe(3*k+2, 1) date(3*k+2, 1)+1 ddem(3*k+2, 1) DeltaC(i, 1) PrixC(i, 1) optimumC(i, 1) ; ...    
        Ligne(3*k+3, 1) Classe(3*k+3, 1) date(3*k+3, 1) dem(3*k+3, 1) delta(3*k+3, 1) prix(3*k+3, 1) ddem(3*k+3, 1) ; ...
        Ligne(3*k+3, 1) Classe(3*k+3, 1) date(3*k+3, 1)+1 ddem(3*k+3, 1) DeltaF(i, 1) PrixF(i, 1) optimumF(i, 1) ];
     
        fid = fopen('test.txt', 'w');
        fprintf(fid, '%s/n', assemblage);
        fclose(fid);
     
    end
    Il me semble ne pas me tromper sur l'usage de fprintf.

    Malheureusement Matlab ne veut rien entendre, et je suis décidément bloqué par le fait d'avoir des "cells"...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ??? Error using ==> fprintf
    Function is not defined for 'cell' inputs.
     
    Error in ==> tarifs at 165
        fprintf(fid, '%s/n', assemblage);

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Bonjour,

    La concaténation est inutile pour enregistrer les données.

    Au début de ton programme, mets la ligne de commande avec FOPEN qui permet de notifier à matlab que tu vas écrire dans ce fichier.

    Ensuite, tu utilises FPRINTF pour plusieurs variables et différents types de variables.
    regardes la documentation sur fprintf et en particulier le tableau "conversion Characters" et celui qui suit "Espace Characters".

    Tu peux également utiliser FPRINTF autant de fois que tu veux tant que tu n'as pas fermer l'écriture avec FCLOSE que tu n'oublieras pas d'indiquer à la fin de ton programme.

    Tu peux écrire dans ton fichier texte en même temps que tu fais les calculs ce qui peut te permettre d'utiliser que des variables locales...

    Christophe
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Ouhlà ! Je vais devoir revoir intégralement le programme alors !
    Allez, c'est parti ! Merci pour le coup de pouce !

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Il m'aura fallu du temps, mais le résultat est là. D'accord, ce n'est pas beau ni efficace, mais ça fonctionne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    %% ASSEMBLAGES MATRICE RESULTATS
     
    fid = fopen('data_J+1.txt', 'w');
    fprintf(fid,  '%5s\t%2s\t%6s\t%6s\t%6s\t%6s\t%8s\t\r\n', 'Ligne', 'Cl.', 'date', 'demJ', 'delta', '$J+1', 'demJ+1');
     
    for k=0:1:length(dem)/3-1;
        i=k+1;
     
    % construction matrice de resultats sans strings (sans colonnes 1 et 2)
        L1 = [date(3*k+1, 1) dem(3*k+1, 1) delta(3*k+1, 1) prix(3*k+1, 1) ddem(3*k+1, 1)] ;
        L2 = [date(3*k+1, 1)+1 ddem(3*k+1, 1) DeltaY(i, 1) PrixY(i, 1) optimumY(i, 1)] ;
        L3 = [date(3*k+2, 1) dem(3*k+2, 1) delta(3*k+2, 1) prix(3*k+2, 1) ddem(3*k+2, 1)] ;
        L4 = [date(3*k+2, 1)+1 ddem(3*k+2, 1) DeltaC(i, 1) PrixC(i, 1) optimumC(i, 1)] ;
        L5 = [date(3*k+3, 1) dem(3*k+3, 1) delta(3*k+3, 1) prix(3*k+3, 1) ddem(3*k+3, 1)] ;
        L6 = [date(3*k+3, 1)+1 ddem(3*k+3, 1) DeltaF(i, 1) PrixF(i, 1) optimumF(i, 1) ] ;
     
    % construction matrice de resultats avec strings only (col 1 et 2)
        S1 = [Ligne(3*k+1, 1) Classe(3*k+1, 1)] ;
        S2 = [Ligne(3*k+1, 1) Classe(3*k+1, 1)] ;
        S3 = [Ligne(3*k+2, 1) Classe(3*k+2, 1)] ;
        S4 = [Ligne(3*k+2, 1) Classe(3*k+2, 1)] ;
        S5 = [Ligne(3*k+3, 1) Classe(3*k+3, 1)] ;
        S6 = [Ligne(3*k+3, 1) Classe(3*k+3, 1)] ;
     
            s1=char(S1(1));
            s2=char(S2(1));
            s3=char(S3(1));
            s4=char(S4(1));
            s5=char(S5(1));
            s6=char(S6(1));
            ss1=char(S1(2));
            ss2=char(S2(2));
            ss3=char(S3(2));
            ss4=char(S4(2));
            ss5=char(S5(2));
            ss6=char(S6(2));
                fprintf(fid,  '%3s\t%3s\t%6.0f\t%6.0i\t%6.0f\t%6.0f\t%8i\t\r\n', s1, ss1, L1, s2, ss2, L2, s3, ss3, L3, ...
                    s4, ss4, L4, s5, ss5, L5, s6, ss6, L6);
    end
    fclose(fid);
    Voici le fichier de sortie 'data_J+1.txt' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Ligne	Cl.	  date	  demJ	 delta	  $J+1	  demJ+1
    MCO	  Y	5	1000	100	600	900
    MCO	  Y	6	900	500	1100	400
    MCO	  C	5	500	100	1600	450
    MCO	  C	6	450	340	1940	280
    MCO	  F	5	250	100	3100	225
    MCO	  F	6	225	508	3608	98
    NCE	  Y	5	300	10	110	200
    NCE	  Y	6	200	-20	90	400
    NCE	  C	5	200	10	210	150
    NCE	  C	6	150	-26	184	280
    NCE	  F	5	100	10	310	75
    NCE	  F	6	75	-9	301	98
    CDG	  Y	5	500	50	550	400
    CDG	  Y	6	400	0	550	400
    CDG	  C	5	300	50	1200	280
    CDG	  C	6	280	0	1200	280
    CDG	  F	5	100	50	1500	95
    CDG	  F	6	95	-30	1470	98
    Un grand merci pour vos coups de pouce, en tous cas.
    Cela dit, si jamais vous avez des idées d'optimisation, je peux peut-être me pencher dessus.

  13. #13
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Bonjour,

    Un premier tour rapide :
    1/ A quoi sert ta variable i ? => à rien, non ? (suffit de la remplacer par k+1 là où tu l'as utilisée)
    2/ N'y a-t-il pas une erreur sur les S2 (=S1), S4 (=3=, S6 (=S5) ?
    3/ Je suppose que tu utilises CHAR car tu as des tableaux de cellules
    Alors que si je ne me trompe pas, on devrait avoir simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    s1 = Ligne{3*k+1,1};
    ...
    ss1 = Classe{3*k+1,1};
    Mais bon pour être sûr il faudrait avoir une idée de ce que sont Ligne et Classe.

    Peux-tu nous donner ce que retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    whos Ligne
    whos Classe
    Règles du Forum

    Adepte de la maïeutique

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Bonjour Caro-Line,

    Citation Envoyé par Caro-Line Voir le message
    1/ A quoi sert ta variable i ? => à rien, non ? (suffit de la remplacer par k+1 là où tu l'as utilisée)
    Non effectivement, elle ne sert pas à grand chose, sinon à me clarifier le programme, en différenciant k et i.

    Citation Envoyé par Caro-Line Voir le message
    2/ N'y a-t-il pas une erreur sur les S2 (=S1), S4 (=3=, S6 (=S5) ?
    Non, il s'agit bien d'une redondance voulue. Je rappelle la Ligne aérienne à laquelle est appliqué le modèle, ainsi que sa classe (Y, C ou F).

    Citation Envoyé par Caro-Line Voir le message
    3/ Je suppose que tu utilises CHAR car tu as des tableaux de cellules
    Alors que si je ne me trompe pas, on devrait avoir simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    s1 = Ligne{3*k+1,1};
    ...
    ss1 = Classe{3*k+1,1};
    Mais bon pour être sûr il faudrait avoir une idée de ce que sont Ligne et Classe.
    Oui, c'est bien ça. L'utilisation de CHAR est la seule solution que j'ai trouvé afin de pouvoir utiliser fprintf, puisque cette fonction n'est apparemment pas compatible avec les CELL...
    Comme demandé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >> whos Ligne
      Name       Size            Bytes  Class    Attributes
     
      Ligne      9x1               594  cell  
    >> whos Classe
      Name        Size            Bytes  Class    Attributes
     
      Classe      9x1               558  cell
    J'avoue que j'ai "toutouillé" quand même pas mal pour parvenir à injecter les deux premières colonnes avec fprintf. Je ne maîtrise ni ne comprend pas vraiment ce qui se passe en arrière plan.

  15. #15
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Une proposition (non testée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    %% ASSEMBLAGES MATRICE RESULTATS
     
    fid = fopen('data_J+1.txt', 'wt'); %% Rajouter l'option t pour plus d'efficacité
    fprintf(fid,  '%5s\t%2s\t%6s\t%6s\t%6s\t%6s\t%8s\t\r\n', 'Ligne', 'Cl.', 'date', 'demJ', 'delta', '$J+1', 'demJ+1');
     
    for k=0:length(dem)/3-1;
     
    	% construction matrice de resultats sans strings (sans colonnes 1 et 2)
    	for n = 1:2:5
    		L{n} = [date(3*k+(n+1)/2, 1) dem(3*k+(n+1)/2, 1) delta(3*k+(n+1)/2, 1) prix(3*k+(n+1)/2, 1) ddem(3*k+(n+1)/2, 1)] ;
    	end		
     
    	L{2} = [date(3*k+1, 1)+1 ddem(3*k+1, 1) DeltaY(k+1, 1) PrixY(k+1, 1) optimumY(k+1, 1)] ;
     
    	L{4} = [date(3*k+2, 1)+1 ddem(3*k+2, 1) DeltaC(k+1, 1) PrixC(k+1, 1) optimumC(k+1, 1)] ;
     
    	L{6} = [date(3*k+3, 1)+1 ddem(3*k+3, 1) DeltaF(k+1, 1) PrixF(k+1, 1) optimumF(k+1, 1) ] ;
     
    	% construction matrice de resultats avec strings only (col 1 et 2)	
    	for n = 1:3
            	col{1}{n} = Ligne{3*k+n,1};
    		col{2}{n} = Classe{3*k+n,1}:
    	end
    	fprintf(fid,  '%3s\t%3s\t%6.0f\t%6.0i\t%6.0f\t%6.0f\t%8i\t\r\n', col{1}{1}, col{2}{1}, L{1}, col{1}{1}, col{2}{1}, L{2, col{1}{2}, col{2}{2}, L{3}, ...
                    col{1}{2}, col{2}{2}, L{4}, col{1}{3}, col{2}{3}, L{5}, col{1}{3}, col{2}{3}, L{6});
    end
    fclose(fid);
    Je sais que la redondance c'est important dans les avions mais dans un code c'est inutile


    Essaye de lire le lien FAQ sur les tableaux de cellules que je t'ai donné, les cellules c'est vraiment important à comprendre et super utile.
    Règles du Forum

    Adepte de la maïeutique

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Concaténer les résultats d'une boucle
    Par fifou92 dans le forum Langage
    Réponses: 2
    Dernier message: 04/07/2008, 10h13
  2. "Concaténer" le résultat de requête
    Par senacle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/03/2008, 10h53
  3. Concaténation de résultats
    Par nico.developper dans le forum Jasper
    Réponses: 2
    Dernier message: 16/01/2008, 01h22
  4. Résultat de boucle <select> sur 2 lignes
    Par lodan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 25/09/2006, 09h31
  5. Concaténer le résultat d'une requête
    Par maliba dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 03/06/2006, 04h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo