2016-06-27 1 views
1

J'ai installé Matlab 2014 dans Ubuntu. Mon problème: Je compile plusieurs fichiers d'entrée pour un autre programme, Quantum Espresso, dans Matlab. Maintenant, je devrais passer ces fichiers à Quantum Espresso en utilisant la ligne de commande matlab. Maintenant, je sais que je peux le faire en utilisant Linux Terminal, mais ma façon de résoudre mon problème a atteint le point que ma seule option est d'appeler «Quantum Espresso from matlab». Un seul appel est en fait simple:l'appel d'un programme externe dans matlab dans une boucle

! installation/folder/espresso-5.3.0/bin/pw.x <inputfile> outputfile 

Le problème est que j'ai plusieurs fichiers d'entrée nommés comme 1name.in 1name.in .... Donc, ces appels répétés devraient être faits en boucle. Mais comment?

J'ai essayé: le script shell pour boucler les fichiers. J'ai ajouté ce supplément '!' à chaque ligne du script mais cela ne fonctionne pas. J'ai essayé aussi d'écrire une boucle comme ceci:

for i = 1:N 

prefix = int2str(i); 
fuloutname = [prefix 'name' '.' 'out']; 
fulinname = [prefix 'name' '.' 'in']; 
! adress/espresso-5.3.0/bin/pw.x <fulinname> fuloutname ; 

end 

où « N » en nombre de mes fichiers d'entrée. Clairement exécuter cela signifie que vous passez un fichier nommé 'fulinname' pas 1name.in et se traduira par un fichier de sortie nommé 'fuloutname'

J'ai également essayé de le faire comme vous chargez normalement plusieurs fichiers dans une boucle, mais aussi n'a pas fonctionné

S'il vous plaît aidez-moi.

+1

Vous devez utiliser la fonction 'unix',' mycommand = « et' mycall'' unix (mycommand) ' – obchardon

+0

@obchardon Dois-je utiliser comme:' command1 = 'pour la valeur dans $ 1 * .in'' ... et ensuite 'unix (commande1)'? Il en résulte une erreur: '/ bin/bash: -c: ligne 1: erreur de syntaxe: fin inattendue du fichier' –

+0

l'a déplacé de la réponse - @ fb.researcher - essaie dans matlab'! 'Plus la chaîne. Je crois vraiment que @obchardon a répondu correctement à la question. – bdecaf

Répondre

1

Vous devez utiliser la fonction unix:

for i = 1:N 

prefix = int2str(i); 
fuloutname = [prefix 'name' '.' 'out']; 
fulinname = [prefix 'name' '.' 'in']; 
mycommand = ['adress/espresso-5.3.0/bin/pw.x < ',fulinname,' > ',fuloutname]; 
unix(mycommand); 
%system(mycommand); %will give you the same, result and this function is cross-platform 

end 
+0

mais je pense que la commande 'system' serait l'équivalent de'! '. (il fonctionne également sur win) – bdecaf

+0

'unix' fonctionnera pour unix machine,' dos' pour Windows machine et 'system' pour les deux machines. Alors oui, il donnera exactement la même sortie. – obchardon

+0

@obchardon Le résultat est 'STOP 1' quand il atteint la ligne' unix (mycommand); ' –