Importation de matrice sous fortran

Fermé
Oscar - 22 avril 2002 à 18:13
 amandine - 18 janv. 2008 à 13:20
Voilà, je sais ouvrir des fichiers de données ligne ou colonne sous fortran mais je n'arrive pas à lire des matrices.
Par exemple, je suis sous matlab, j'exporte un fichier truc.txt qui contient une matrice 3x3. Je ne sais récuprérer qu'une ligne ou une colonne.

Si quelqu'un sait comment il faut faire (à part transformer ma matrice en succession de colonnes au format 1x9 par exemple), pourrait-il m'envoyer l'instruction à taper sous fortran...Merci d'avance!!!

6 réponses

DIMENSION MATR(3,3)
IUNIT = 10
OPEN(IUNIT,NAME='truc.txt',ERR=label1)
C --- Remplissage par ligne (1,1), (1,2), (1,3), (2,1), (2,2), ...
READ(IUNIT,*[,ERR=label]) (((MATR(I,J),J=1,3),I=1,3)

où "*" = format automatique (valeurs séparées par un espace au moins,
sinon format en "Iw","Fw.d","Ew.d" avec facteur de multiplication, comme indiqué dans tout bon manuel
2
Merci encore, nul doute que cette astuce va me permettre de gagner un temps précieux!
0
Bonjour,
Je débute en fortran 77 et je rencontre quelques problèmes. Je souhaite écrire un matrice de zéro de plusieurs lignes et de 32 colonnes dans un fichier texte mais je n'y arrive pas. J'ai essayé plusieurs techniques mais rien y fait.
J'ai d'abors écrit:
parameter (NBLIG=10,NBCOL=32)
real*8 matrice(NBLIG,NBCOL)

IL=0
IC=0

open(unit=1,file='matrice.dat',status='new')

6 write(1,2) (matrice(IL,1:NBCOL))
2 format(32(x,F8.5))
IL=IL+1
IF(IL.EQ.NBLIG) GOTO 3
GOTO 6
3 close (unit=1)
end

mais j'ai ce message d'erreur "Output statement overflows record". J'ai essayé d'utilisé iunit mais sans plus de succès.
Si quelqu'un sait comment je peux faire, pourrait-il m'envoyer quelque éléments de réponse....
merci d'avance
0
En Fortran, par défaut, les tableaux ou les matrices ont des indices commençant à 1.
Dans tes ordres d'écriture, tu utilises l'indice IL, initialisé à 0, ce qui cherche à accéder à une zone mémoire hors de la matrice. Si cette zone est protégée, il appaîtra un message du style "access violation". Sinon, le résultat sera n'importe quoi, mais sans rien qui le signale !

Chaque enregistrement en sortie occupe 32 x 9 octets soit 288 octets. Il faut sans doute préciser une taille d'enregistrement logique dans l'ordre OPEN (vérifier dans le manuel, si cette taille n'est pas limitée à 256).

Voilà un peu comment j'aurais écrit ce bout de code (tout en majuscules, ajout de commentaires, alignement et/ou indentation, ...) ... bien que n'ayant pas touché au Fortran depuis plus de 10 ans :
 
     PARAMETER (NBLIG=10,NBCOL=32)
     REAL*8 MATRICE(NBLIG,NBCOL) 
C --- Remplissage de la matrice
C     (ne pas compter sur le chargement du programme par la machine)
      DO 20 IL = 1, NBLIGN
        DO 10 IC = 1, NBCOL
          MATRICE(IL,IC) = 0.
   10   CONTINUE
   20 CONTINUE
C --- Sauvegarde sur fichier :
      OPEN(UNIT=1,FILE='matrice.dat',STATUS='new') 
C     DO 100 IL = 1,NBLIGN
C       WRITE(1,2) (MATRICE(IL,IC),IC=1,NBCOL))
C 100 CONTINUE
C --- la même chose que ci-dessus en plus compact :
      WRITE(1,2) ((MATRICE(IL,IC),IC=1,NBCOL),IL=1,NBLIG)
      CLOSE (UNIT=1)
    2 FORMAT(32(X,F8.5))
      END


NB : le forum permet de "conserver la mise en forme du texte sélectionné".
0
Merci pour ces informations et le code que tu m'a fourni est très bien mais il ne résout pas le problème car j'ai le même message d'erreur. Comme tu l'as dit, c'est la taille des données en sortie qui pose un problème. Malheureusement, je suis obligé d'utiliser ce format de sortie. Sais-tu si il existe un moyen d'augmenter la taille d'enregistrement logique dans l'ordre OPEN?
Merci d'avance
0

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

Posez votre question
Si le langage est à peu près universel, il n'en est pas de même de l'implémentation des fichiers et de leurs fonctions d'accès depuis un langage évolué (non visibles du programmeur), qui dépendent de chaque machine ("machine dependant").
Il faut donc consulter le "Programmer's guide" correspondant, et notamment les chapitres récapitulant les messages d'erreur.
A défaut d'en avoir sous la main, on peut en trouver sur Internet, avec les mots-clés "programmer's guide" Fortran {type-de-machine}...

Exemple de paramètres de la directive "OPEN" :
OPEN( 21, ..., RECL={en octets}, FORM='FORMATTED')


* RECL permet d'introduire la taille de l'enregistrement.
* FORM permet d'indiquer que le fichier contiendra de l'ASCII (ou autre), sinon ce sera du "binaire" (= image mémoire des nombres). double précision)
0
Je n'avais pas encore eu le temps de me repencher sur mon problème de matrices. Tu avais raison Marden, l'utilisation de RECL m'a permis de choisir la taille de l'enregistrement et ainsi de résoudre mon problème. Merci beaucoup pour ton aide.
0