Lettura di valori di testo in variabili matlab da file ASCII
-
06-07-2019 - |
Domanda
Considera il seguente file
var1 var2 variable3
1 2 3
11 22 33
Vorrei caricare i numeri in una matrice e i titoli delle colonne in una variabile che sarebbe equivalente a:
variable_names = char('var1', 'var2', 'variable3');
Non mi dispiace dividere i nomi e i numeri in due file, tuttavia preparare i file di codice matlab e valutarli non è un'opzione.
Nota che può esserci un numero arbitrario di variabili (colonne)
Soluzione
Suggerisco importdata per operazioni come questa:
d = importdata('filename.txt');
Il ritorno è una struttura con i campi numerici in un membro chiamato 'dati' e le intestazioni di colonna in un campo chiamato 'colheaders'.
Un'altra utile interfaccia per l'importazione di dati manipolatori come questi è la classe 'dataset' disponibile nella Statistics Toolbox.
Altri suggerimenti
Se l'intestazione è nella prima riga, allora
A = dlmread(filename,delimString,2,1);
leggerà i dati numerici in Matrix A.
È quindi possibile utilizzare
fid = fopen(filename)
headerString = fscanf(fid,'%s/n') % reads header data into a string
fclose(fid)
È quindi possibile utilizzare strtok per dividere headerString in un array di celle. È un approccio che mi viene in mente di affrontare un numero sconosciuto di colonne
modificarechiamata a funzione fscanf fissa
Usa solo textcan con specificatori di formato diversi.
fid = fopen(filename,'r');
heading = textscan(fid,'%s %s %s',1);
fgetl(fid); %advance the file pointer one line
data = textscan(fid,'%n %n %n');%read the rest of the data
fclose(fid);
In questo caso 'header' sarà un array di celle contenente celle con ciascuna intestazione di colonna all'interno, quindi dovrai cambiarle in array di celle di stringhe o qualunque cosa tu voglia. 'data' sarà una matrice di celle contenente una matrice numerica per ogni colonna che leggi, quindi dovrai combinarle per creare una matrice.