Evitare di scrivere indicatore di conversione per ogni colonna nella tabella di grandi dimensioni in `textscan`

StackOverflow https://stackoverflow.com/questions/8805685

  •  26-10-2019
  •  | 
  •  

Domanda

Sto leggendo i dati da una tabella utilizzando textscan(). La tabella ha 90 colonne e voglio leggere i valori di ciascuna colonna come numero a virgola mobile. Guardando la documentazione, devo usare specificatore %f - ma sembra che ho bisogno di usare 90 volte, così finisco con questo:

c = textscan(fid,'%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
                  %f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
                  %f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
                  %f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f');

che fondamentalmente funziona, ma mi chiedo se c'è qualche modo per aggirare Per evitare di digitare identificatore per ogni colonna che ho in mio tavolo.

È stato utile?

Soluzione

Usa repmat per costruire la vostra stringa di formato in base al numero di colonne.

nCols = 60;
format = repmat('%f', [1 nCols]);
c = textscan(fid, format);

Questo è abbastanza flessibile da utilizzare se si ha ad esempio un paio colonne stringa mista a.

nNumberCols = 58;
format = ['%s%s' repmat('%f', [1 nNumberCols])];
c = textscan(fid, format);

Altri suggerimenti

Per un semplice file ASCII composta da 90 colonne di numeri in virgola mobile separato da un delimitatore nota, forse sarebbe più semplice utilizzare la funzione di Matlab dlmread .

Per esempio, se il vostro rand.txt file è:

0.8147    0.0975    0.1576    0.1419    0.6557
0.9058    0.2785    0.9706    0.4218    0.0357
0.1270    0.5469    0.9572    0.9157    0.8491
0.9134    0.9575    0.4854    0.7922    0.9340
0.6324    0.9649    0.8003    0.9595    0.6787

È possibile utilizzare: randmat=dlmread('rand.txt');

Si può solo fare un textSCAN con una sola "% f" e poi rimodellare come si desidera o convertirlo in cella come si vuole:

fid=fopen('bla.txt','r');
M=textscan(fid,'%f')
M=reshape(M{1},[],5)
M=num2cell(M,1)
fclose(fid);

vorrei suggerire l'uso:

fileId=fopen('fileloc.txt');
formatSpec='%f';
N=90;
data=textscan(fileId,formatSpec,N);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top