comment écrire une énorme matrice de fichier ligne par ligne (fortran 90)
Je veux écrire une matrice avec un grand nombre de données dans un fichier ligne par ligne. Par exemple, j'ai une matrice de 100*100 et je veux l'avoir dans le formulaire 100*100 dans le fichier. Toutefois, il ne fonctionne pas.Voici mon code et une description. N et M sont des nombres entiers autour de quelques centaines. RÉCUPÉRABLE est de la durée prévue j'ai mis le fichier mais ici, il semble que cette commande ne fonctionne pas. La sortie est à 198 lignes lorsque N est de 99
et M est situé à 200. Vec est un double précision matrice complexe. Comment pourrais-je sortie les valeurs de Vec gardant son format d'origine N*M? Ma compilation de commande est "ifort -o test.f90".
open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace",RECL=40*M+10)
do i=1,N
do j=1,M
write(2, '(F)', advance='no') real(Vec(i,j))
end do
write(2, *) ''
end do
Suivant @george conseils, j'ai codé un programme comme ceci:
program test
implicit none
integer i,j
open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,500
write(2, '(1600F14.7)')( 0.00001 ,j=1,499)
end do
close(2)
end
Avec ce code, le problème est résolu! Peut-être que je n'ai pas compilé correctement la dernière fois.
Et comment est -
Vec
déclaré? J'espère que vous n'essayez pas d'exécuter votre code avec différents M
et N
sur 100x100 tableau?vous avez besoin d'un répétez spécificateur de format. Dans les anciennes fortran vous avez besoin d'un nombre réel par exemple. '(1000F14.7)", où le nombre est quelque chose de plus grand que m. Les dernières normes de permettre un "*" .. Le format explicite à l'avance = pas de va remplacer tout ce que vous mettez pour récupérable sur ouvrir.
"ne pas travailler" signifie que lorsque M est sur nombre spécifique comme 200,300, les éléments d'une rangée de 3 lignes dans le fichier. Ce que je veux, c'est, ligne par ligne, comme la façon dont il est stocké dans le code. Vec est affectables tableau Vec(N,M), alors ne vous inquiétez pas sa légitimité...
Mhm, votre code fonctionne très bien avec moi - pour les deux
gfortran
(4.7.3) et ifort
(13.1.3). La version de ifort
utilisez-vous?OriginalL'auteur someone | 2013-09-17
Vous devez vous connecter pour publier un commentaire.
expansion sur mon commentaire, vous devez également utiliser une boucle implicite..essayez ceci:
ou suffisamment les compilateurs modernes (je ne suis pas sûr de la façon dont les nouvelles.. )
Remarque comme cela a été souligné, la parenthèse autour de
(F14.7)
sont nécessaires pour la*
illimité-format-élément dans l'2008 standard.peut aussi bien tirer dans les autres commentaires, vous pouvez également le faire:
ifort
etgfortran
. Voir ici.Juste par curiosité: Quel est l'avantage de la boucle implicite sur l'partielle de la matrice de dans la réponse précédente?
pas de différence ici, depuis real() peut prendre un vectorielles ou scalaires argument.
Implicite dans I/O est parfois plus lent que la matrice de paragraphes ibm.com/developerworks/community/blogs/...
OriginalL'auteur agentp
ifort
utilise par défaut la longueur d'enregistrement de80
. Tout au-delà de ce qui est mis sur la ligne suivante. Vous pouvez étendre qu'à l'exécution, par délivranceexport FORT_FMT_RECL=250
, qui s'étend qu'à 250 caractères. (Vous avez besoin d'ajuster ce nombre, bien sûr).Mais ma conjecture serait le spécificateur de format d'écrire votre déclaration. Avez-vous essayer d'écrire la matrice ligne par ligne au lieu de l'élément-sage? Ensuite, vous pouvez spécifier directement le nombre d'éléments (au lieu d'utiliser
advance='no'
).Ce post pourrait être utile aussi bien!
EDIT:
L'écriture ligne par ligne pourrait être réalisé comme ceci:
Oh, c'est quelque chose que vous spécifiez au moment de l'exécution - donc, il suffit d'appeler votre programme comme
export FORT_FMT_RECL=250; ./a.out
ouFORT_FMT_RECL=250 ./a.out
.l'a obtenu. Je vous remercie. Je suis toujours là, vous vous demandez comment décider de la RÉCUPÉRABLE nombre. Est-il parfois de la colume nombre? Je pose N=500 et M=1500 et courir comme ce "FORT_FMT_RECL=3000 ./un."mais obtenir un fichier txt avec 2994 lignes....Dois-je également définir RÉCUPÉRABLE nombre dans mon code?
J'ai essayé comme vous l'avez suggéré et semble FORT_FMT_RECL= ne fonctionne pas. Je suis en train d'étudier votre avis "l'écriture de la matrice ligne par ligne". pourriez-vous nous donner plus d'informations à ce sujet?
Vous spécifiez la longueur de l'enregistrement dans l'instruction open, je pense que le nombre spécifié il y a la priorité. J'ai ajouté un exemple de code pour la réponse, sans obligation
RECL
. Avec qui,FORT_FMT_RECL=
devrait avoir un impact.OriginalL'auteur Alexander Vogt