2009-03-30 19 views
2

Ich möchte Variablen aus einer Textdatei laden.Laden von Werten aus einer Textdatei in MATLAB

Zum Beispiel meine Textdatei, varA, varB und varC.

In MATLAB möchte ich diesen Variablen Werte geben, so dass jede Variable eine 2x2-Matrix ist.

So aus der Textdatei die oben genannten Informationen enthält, würde ich eine Matrix erhalten, die wie folgt aussieht:

[ 1 2 3 4 5 6; 
    1 2 3 4 5 6] 

ist das möglich?

Ich habe ein zweites Beispiel hinzugefügt, um die Dinge etwas klarer zu machen.

Meine Textdatei, text.txt, sieht aus wie dieses

x1 x2 x3 

In MATLAB meine .m-Datei die Werte für diese Variablen wie

x1 = [1 1; 1 1] 
x2 = [2 2; 2 2] 
x3 = [3 3; 3 3] 

So gibt, wenn ich meine Text-Datei ich importieren erhalten würde

a = (textfile) 
a = [1 1 2 2 3 3 ; 1 1 2 2 3 3] 

ich versuche im Grunde ein genetic algorithm (GA) auf ein sehr großes Problem anzupassen (von travelling salesman problem (TSP) Typ). Das Problem ist, dass jede Variable, die ich habe, eine Matrix ist und die Crossover-, Fitness- und Mutationscodes ziemlich kompliziert werden. Und ich habe Probleme, eine zufällige Startpopulation zu machen.

Ich möchte zufällig, sagen wir 30 Variablen, aus einer Liste mit 256 auswählen, so dass die Variable nur einmal ausgewählt werden kann. Jede Variable hat jedoch ihre eigenen spezifischen Werte in einer 2 * 2-Matrix, die nicht geändert werden kann.

Ich mag würde randperm verwenden und dann einen x vor jedem Wert legte sie bei Variablen statt Werte zu machen ...

+0

Werden in der Textdatei nur die Variablennamen gespeichert oder werden auch die Daten gespeichert, die diesen Variablen zugewiesen werden sollen? – gnovice

+0

Das klingt nach einem sehr verwirrenden und komplizierten Problem. Könnten Sie auf die größere Anwendung eingehen, für die alles verwendet wird? Ich habe das Gefühl, dass es viel leichtere Möglichkeiten gibt, mit Ihrem Problem umzugehen, als Variablennamen aus einer Datei zu lesen (wie zum Beispiel mit .mat Dateien). – gnovice

Antwort

6

Wenn die Daten in der Textdatei sieht wie folgt aus (Strings getrennt durch Leerzeichen):

x1 x2 x3 ... 

Sie können die Strings in einem Zellenfeld gelesen TEXTSCAN mit etwa so:

fid = fopen('file.txt','r'); 
A = textscan(fid,'%s'); 
fclose(fid); 
A = A{:}; 

A speichert die Strings jetzt in einem Zellenfeld: {'x1'; 'x2'; "x3"; ...}. Nun, um eine Variable zu machen aus einem dieser Strings und ihm einen Wert zuweisen, würde ich ASSIGNIN verwenden:

assignin('base',A{1},[1 2; 1 2]); 

Dies wird eine variable x1 in der Basis-Arbeitsbereich erstellen und zuweisen den Wert [1 2; 1 2]. Das erste Argument kann entweder 'Basis' oder 'Aufrufer' sein, um eine Variable entweder im MATLAB-Basisarbeitsbereich oder im Arbeitsbereich der Aufruferfunktion zu erstellen. Sie würden dies für jeden String-Namen in A wiederholen und den gewünschten Wert angeben.


WECHSELN OPTION:

Dies ist eine alternative Antwort auf das, was ich Ihnen oben gab. Die obige Antwort bezieht sich auf das spezifische Problem, das Sie in Ihrer Frage angesprochen haben. Diese Antwort gibt Ihnen eine ganze andere Möglichkeit zu vermeiden, Dinge zu tun, wie Sie sie in Ihrer Frage beschrieben haben, und es wird Ihnen hoffentlich die Dinge leichter machen ...

Wenn ich Ihr Problem verstehe, haben Sie im Grunde 256 2-by-2-Matrizen, und Sie möchten 30 von ihnen zufällig auswählen. Jede dieser 2-mal-2-Matrizen klingt so, als wäre sie in einer eigenen Variablen gespeichert (x1 bis x256). Stattdessen würde ich alle 256 Matrizen in nur eine Variable entweder als ein 3-D-Array vorschlagen Speichern:

xArray = zeros(2,2,256);  % Initialize all matrices as [0 0; 0 0] 
xArray(:,:,1) = [1 1; 2 2]; % This enters a value for the first matrix 

oder ein Zellenfeld:

xArray = cell(1,256); % Initializes an empty array of cells 
xArray{1} = [1 1; 2 2]; % Enters a value for the first matrix 

Sie würden die Werte zunächst initialisiert werden müssen. Dann, wenn Sie zufällig wollen 30 Werte auswählen, können Sie neben der Reihenfolge der Randomisierung entweder der dritten Dimension des 3-D-Array oder die Reihenfolge des Zellenfeldes durch RANDPERM mit:

startOrder = 1:256;    % The default order of the matrices 
index = randperm(256);   % Randomly order the numbers 1 to 256 
xArray = xArray(:,:,index);  % For a 3-d array 
xArray = xArray(index);   % For a cell array 

Dann benutzen Sie einfach die ersten 30 Einträge in xArray für Ihre Berechnungen (anstelle der einzelnen Variablen wie Sie vorher waren):

x = xArray(:,:,1); % Puts the first matrix from the 3-D array in x 
x = xArray{1};  % Puts the first matrix from the cell array in x 

Sie halten die Verwendung von RANDPERM Wiederholung neuen randomisierten Arrays von Matrizen halten zu erzeugen. Wenn Sie den Überblick zu behalten haben, von denen ursprünglichen Matrizen Sie verwenden, müssen Sie diese Zeile hinzufügen, nachdem Sie xArray randomisieren:

startOrder = startOrder(index); 

nun die Einträge von Startreihenfolge erhalten Sie die ursprüngliche Position erzählen eine Matrix war Wenn beispielsweise der erste Arrayeintrag in startOrder 40 ist, dann war die Matrix in der ersten Position xArray ursprünglich die 40. Matrix, die Sie beim Initialisieren xArray eingegeben haben.

Hoffe, das hilft!

+0

Danke für die schnelle Antwort ... aber ich möchte es anders herum tun. Was bedeutet, dass meine Textdatei Namen von Variablen wie VarA enthält, VARB ... Dann ich konnte sie in Matlab laden, wo würde jeder var eine 2x2-Matrix werden .. zB text = x in Matlab x = [0 1 ; 2 3] –

+0

Ich habe meine Antwort aktualisiert, um die überarbeitete Frage zu beantworten. – gnovice

+0

thx.Allerdings würde ich gerne die Variablen importieren, ohne sie erneut benennen zu müssen (256 Variablen, die sich in der Reihenfolge in einer Schleife ändern), also ist mein einziges Problem, das '' weg von den Textfeldern zu bekommen, während textscan benutzt wird. so dass x wäre x und nicht 'x' –

Verwandte Themen