Como posso salvar uma grande matriz de MATLAB escassa para um arquivo de texto?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho uma matriz esparsa 30000x14000 em MATLAB (version 7), o que eu preciso para usar em outro programa. Chamando save não vou escrever isso como ASCII (não suportado). Chamando full() sobre este monstro resulta em um erro Out of Memory.
Como faço para exportá-lo?

Foi útil?

Solução 3

Eu salva-lo como texto usando Java dentro MATLAB. Código MATLAB:


pw=java.io.PrintWriter(java.io.FileWriter('c:\\retail.txt'));
line=num2str(0:size(data,2)-1);
pw.println(line);
for index=1:length(data)
    disp(index);
    line=num2str(full(data(index,:)));
    pw.println(line);
end
pw.flush();
pw.close();

Aqui data é um extremamente grande matriz esparsa.

Outras dicas

Você pode usar encontrar para obter vetores de índices e de valor:

[i,j,val] = find(data)
data_dump = [i,j,val]

Você pode recriar os dados de data_dump com spconvert, que se destina a "Importar de formato externo matriz esparsa" (então eu acho que é um formato bom exportação):

data = spconvert( data_dump )

Você pode salvar a ascii com:

save -ascii data.txt data_dump

Mas isso despeja índices como dupla, você pode escrevê-lo mais bem com fopen / fprintf / fclose:

fid = fopen('data.txt','w')
fprintf( fid,'%d %d %f\n', transpose(data_dump) )
fclose(fid)

Espero que isso ajude.

Salvar a matriz esparsa como um arquivo .mat. Então, no outro programa, use uma biblioteca apropriada para ler o arquivo .mat.

Por exemplo, se o outro programa é escrito em Python, você pode usar a função scipy.io.mio.loadmat, que suporta matrizes esparsas e dá-lhe uma matriz numpy escassa.

Você tentou particionamento ele?

Eu tento média chamando completo () sobre as 1000 primeiras linhas (ou 5000) e, em seguida, repita o processo se funciona.

Use a função find para obter os índices de não-zero elementos ...

idcs = find(data);
vals = data(idcs);
...save the index vector and value vector in whatever format you want...

Se você quiser, você pode usar ind2sub para converter os índices lineares para fila, subscritos coluna.

Se você precisar recriar uma matriz esparsa em Matlab a partir subscritos + valores, uso spconvert.

dlmwrite - matriz de gravar no arquivo delimitado por ASCII Sintaxe

dlmwrite (nome de ficheiro, H)

dlmwrite (nome de ficheiro, M, 'D')

dlmwrite (nome de ficheiro, M, 'D', R, C)

dlmwrite (filename, M, 'attrib1', value1, 'attrib2', valor2, ...)

dlmwrite (nome de ficheiro, M, '-append')

dlmwrite (filename, M, '-append', lista de atributos de valor)

Se isto é muito bonito um negócio de uma vez, então eu iria apenas percorrer a matriz e escrever a matriz para um arquivo ASCII pela força bruta, ou o uso outra @ sugestão de Veynom e chamar completo () em um subconjunto de linhas. Pode levar um tempo, mas ele provavelmente será feito mais rápido do que ele pode demorar para aprender a ler em um fora do ambiente MATLAB arquivo .mat.

Se isto é algo que você precisa fazer em uma base recorrente, então eu levaria @ Vebjorn 's conselho e usar uma biblioteca para ler o arquivo .mat.

Use este script: msm_to_mm.m , escreve uma matriz MATLAB escassa para um arquivo MatrixMarket.

E Este fio , também pode ser útil.

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