Pergunta

O meu conhecimento de Matlab é apenas em uma necessidade saber a base, então esta é provavelmente uma pergunta elementar. No entanto aqui se trata:

Eu tenho um arquivo contendo dados (16 bits inteiros) armazenados em formato binário. Como eu lê-lo em um vetor / uma matriz no MATLAB? Como faço para escrever esses dados para um arquivo em Matlab? Existe algum ajuste inteligente para aumentar a velocidade de desempenho ao ler / escrever uma enorme quantidade de dados (gigabytes)?

Foi útil?

Solução

Como Bill o Lagarto escreveu você pode usar fread para carregar os dados em um vetor. Eu só quero expandir um pouco sobre sua resposta.

Leitura de Dados

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

Os comandos fopen e fread padrão para Little-endian [1] codificação para os inteiros. Se o arquivo for Big-endian codificado você vai precisar alterar o fread para

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

Além disso, se você quiser ler todo o conjunto de arquivos

>> count=inf;

e se você quiser ler os dados em matriz com n colunas usar

>> count=[n inf];

Escrita de dados

Quanto witting os dados para um arquivo. O comando, fwrite , em resposta de Bill vai escrever para um arquivo binário. Se você quiser gravar os dados em um arquivo de texto que você pode usar dlmwrite

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

Referências

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

Atualização

  1. O formato de máquina (ou seja, IEEE-estar , IEEE-le , vaxd etc.) dos dados binários podem ser especificados em qualquer fopen ou fread comandos em Matlab. Detalhes da suportada formato de máquina pode ser encontrado em documentação de fopen do Matlab.

  2. comentário do
  3. Scott francês para Bill resposta sugere a leitura dos dados em um int16 variável. Para fazer isso use

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

    que count é o tamanho / formato de os dados para ser lido, precisão é o formato de dados, e machineformat é a codificação de cada byte.

  4. Ver comandos fseek para mover o arquivo. Por exemplo,

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

    rebobina o arquivo para o início onde bof significa início de arquivo .

Outras dicas

Assumindo que você sabe quantos valores você tem armazenado no arquivo, você pode fazer algo como isto para ler os dados em uma matriz.

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

Para gravar dados em um arquivo de fazer isso:

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

A função fwrite retorna o número de elementos (não bytes) gravados no arquivo.

Quanto ajuste de desempenho vai, você pode ler dados em blocos para usar somente tanto quanto você precisa processo. Este é o mesmo em qualquer idioma, e não há nenhuma maneira de acelerá-lo que é específico para Matlab.

Normalmente, eu odeio ligações vendo em uma resposta, mas isso parece muito próximos:

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

Quanto à segunda parte do ajuste de desempenho, tem sido de 6 anos desde que eu usei Matlab, então eu não sei.

HTH

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top