2008-10-20 14 views

Respuesta

3

Lo guardé como texto usando Java dentro de 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(); 

Aquí data es una matriz dispersa extremadamente grande.

+1

Estoy confundido - ¿por qué usaste java.io en lugar del fopen y fprintf integrados de MATLAB? – SCFrench

+0

probablemente porque sabía que Java era mejor que el matlab, y era un código descartable, por lo que no necesitaba ser hermoso. solo necesitaba funcionar correctamente :) – Midhat

2

¿Has intentado particionarlo?

Quiero decir, intente llamar a full() en las 1000 primeras filas (o 5000) y luego repita el proceso si funciona.

+0

si eso es siempre una opción, es probable que tome mucho tiempo a escribir ascii chunks y fusionarlos más tarde – Midhat

6

Guarde la matriz dispersa como un archivo .mat. Luego, en el otro programa, use una biblioteca adecuada para leer el archivo .mat.

Por ejemplo, si el otro programa está escrito en Python, puede usar la función scipy.io.mio.loadmat, que admite matrices dispersas y le proporciona una matriz numpy dispersa.

+1

otro programa es rapidminer – Midhat

0

Si esto es más o menos una vez, entonces simplemente iteraría a través de la matriz y escribiría la matriz en un archivo ASCII por fuerza bruta, o usaría @Veynom's sugerencia y call full() en un subconjunto de filas . Puede llevar un tiempo, pero probablemente se hará más rápido de lo que podría tomar para aprender a leer en un archivo .mat fuera del entorno de MATLAB.

Si esto es algo que tiene que hacer de manera recurrente, entonces tomaría el consejo de @Vebjorn y usaría una biblioteca para leer el archivo .mat.

1

utilizar la función find para obtener los índices de elementos distintos de cero ...

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

Si lo desea, puede utilizar ind2sub para convertir los índices lineales a la fila, columna subíndices.

Si necesita recrear una matriz dispersa en matlab a partir de subíndices + valores, use spconvert.

26

Puede utilizar Buscar para obtener el índice & vectores de valor:

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

puede volver a crear los datos de data_dump con spconvert, que está destinado a "Importar de formato externo matriz dispersa" (así que supongo que es una buena formato de exportación):

data = spconvert(data_dump) 

puede guardar en ASCII con:

save -ascii data.txt data_dump 

Pero esto vertederos de índices como el doble, se puede escribir más bien con fopen/fprintf/fclose:

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

Espero que esto ayude.

+4

El data_dump durante el comando fprintf debe transponerse antes de usar de acuerdo con los documentos (http://www.mathworks.com/help/matlab/ref/fprintf.html). Esto sucede porque los datos están escritos en orden de columna. –

+1

He editado en la corrección sugerida @AlanCN. – Joel

1

dlmwrite - Escribir la matriz a ASCII delimitado archivo Sintaxis

dlmwrite (nombre de archivo, M)

dlmwrite (nombre de archivo, M 'D')

dlmwrite (nombre de archivo, M , 'D', R, C)

dlmwrite (nombre de archivo, M, 'attrib1', valor1, 'attrib2', valor2, ...)

dlmwrite (nombre de archivo, M, '-append')

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

Cuestiones relacionadas