Question

Ma connaissance de matlab repose simplement sur le besoin de connaître la base. Il s’agit donc probablement d’une question élémentaire. Néanmoins, voici:

J'ai un fichier contenant des données (entiers 16 bits) stockées au format binaire. Comment puis-je le lire dans un vecteur / un tableau dans matlab? Comment écrire ces données dans un fichier matlab? Existe-t-il une astuce intelligente pour augmenter la vitesse de performance lors de la lecture / écriture d’une énorme quantité de données (gigaoctets)?

Était-ce utile?

La solution

Comme Bill le lézard a écrit vous pouvez utiliser fread pour charger les données dans un vecteur. Je veux juste développer un peu sa réponse.

Lecture des données

>> fid=fopen('data.bin','rb') % opens the file for reading
>> A = fread(fid, count, 'int16') % reads _count_ elements and stores them in A.

Les commandes fopen et fread utilisent par défaut le codage Little-endian [1] pour les entiers. Si votre fichier est codé en Big-endian, vous devrez changer fread en

.
>> A = fread(fid, count, 'int16', 'ieee-be');

En outre, si vous souhaitez lire l'ensemble des fichiers

>> count=inf;

et si vous souhaitez lire les données dans la matrice avec les colonnes n , utilisez

>> count=[n inf];

Écriture de données

En ce qui concerne le regroupement des données dans un fichier. La commande, fwrite , dans La réponse de Bill écrit dans un fichier binaire. Si vous voulez écrire les données dans un fichier texte, vous pouvez utiliser dlmwrite

>> dlmwrite('data.csv',A,',');

Références

[1] http://en.wikipedia.org/wiki/Endianness

Mettre à jour

  1. Le format de la machine (IE, ieee-be , ieee-le , vaxd etc.) des données binaires peuvent être spécifiées dans les champs fopen ou les commandes fread dans Matlab. Détails du supporté format de la machine peut être trouvé dans La documentation de Matlab sur fopen .

  2. Le commentaire de Scott French sur Bill's répondre suggère de lire les données dans un variable int16. Pour ce faire, utilisez

    >> A = int16(fread(fid,count,precision,machineFormat));
    

    compte est la taille / forme de les données à lire, précision est le format de données et machineformat est l'encodage de chaque octet.

  3. Voir les commandes fseek pour déplacer le fichier. Par exemple,

    >> fseek(fid,0,'bof');
    

    rembobine le fichier au début, bof signifiant début du fichier .

Autres conseils

En supposant que vous sachiez combien de valeurs vous avez stockées dans le fichier, vous pouvez faire quelque chose comme ceci pour lire les données dans un tableau.

fid = fopen('data.bin','rb')
A = fread(fid, count, 'int16')

Pour écrire des données dans un fichier, procédez comme suit:

fid = fopen('data.bin','w')
count = fwrite(fid, A, 'int16')

La fonction fwrite renvoie le nombre d'éléments (pas les octets) écrits dans le fichier.

En ce qui concerne le réglage des performances, vous pouvez lire des données en morceaux pour n’utiliser que ce que vous avez besoin de traiter. C’est la même chose dans toutes les langues et il n’ya aucun moyen d’accélérer ce qui est spécifique à Matlab.

Je déteste généralement voir des liens dans une réponse, mais cela semble assez proche:

http://www.mathworks.com/support/tech -notes / 1400 / 1403.html

En ce qui concerne la deuxième partie du réglage des performances, cela fait 6 ans que je n'ai pas utilisé Matlab, donc je ne sais pas.

HTH

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top