Tengo una matriz dispersa 30000x14000 en MATLAB (versión 7), que necesito usar en otro programa. La función de guardar llamada no escribirá esto como ASCII (no compatible). Llamar al full()
en este monstruo produce un error Out of Memory
.
¿Cómo lo exporto?¿Cómo puedo guardar una matriz escasa de MATLAB muy grande en un archivo de texto?
Respuesta
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.
¿Has intentado particionarlo?
Quiero decir, intente llamar a full() en las 1000 primeras filas (o 5000) y luego repita el proceso si funciona.
si eso es siempre una opción, es probable que tome mucho tiempo a escribir ascii chunks y fusionarlos más tarde – Midhat
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.
otro programa es rapidminer – Midhat
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.
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
.
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.
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. –
He editado en la corrección sugerida @AlanCN. – Joel
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)
- 1. cómo crear una matriz muy grande usando matlab
- 2. ¿Cómo lidiar con un archivo de texto muy grande?
- 3. Aplicar PCA en matriz dispersa muy grande
- 4. ¿Cómo debo lidiar con una matriz muy grande en Java?
- 5. ¿Cómo guardo una matriz de enteros en un archivo de texto en Matlab?
- 6. ¿Está almacenando una matriz o cadena de caracteres muy grande?
- 7. HTTP Descargar archivo muy grande
- 8. Cómo imprimir una matriz en un archivo .txt en Matlab?
- 9. Python: cortar un archivo binario muy grande
- 10. Lea un archivo de texto muy grande en una lista en clojure
- 11. ¿Cómo puedo representar un entero muy grande en .NET?
- 12. ¿Cómo puedo usar un diccionario muy grande en C#?
- 13. guardar un archivo de texto en una variable en bash
- 14. Calculando el inverso de una matriz muy grande
- 15. Echo un número muy grande
- 16. ¿Cómo puedo guardar un bloque de texto en modo visual en un archivo en Vim?
- 17. ¿Coincidir una cadena en un archivo de texto grande?
- 18. ¿Cómo puedo guardar una imagen alterada en MATLAB?
- 19. Filtrar archivos en una carpeta muy grande
- 20. Decode escasa JSON objeto de matriz PHP
- 21. Trabajando con un archivo XML muy grande en C#
- 22. ¿Cómo escribir una matriz multidimensional en un archivo de texto?
- 23. diseño de base de datos muy grande para buscar texto
- 24. Multiplicación escasa matriz-vector en CUDA
- 25. ¿Cómo escribir eficientemente un archivo de texto grande en C#?
- 26. Procesando archivo de texto grande en C#
- 27. Cómo guardar datos en archivo .txt en MATLAB
- 28. Cómo crear una referencia de vista/pitón en una matriz escasa scipy?
- 29. ¿Cómo mides un proyecto pequeño, grande y muy grande?
- 30. Leer y analizar el archivo de texto en octava/matlab
Estoy confundido - ¿por qué usaste java.io en lugar del fopen y fprintf integrados de MATLAB? – SCFrench
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