2009-10-28 9 views
7

Quiero usar YAML para comunicar algunos datos en varios idiomas. (Piénselo como "serialización independiente del lenguaje".) Uno de estos lenguajes es MATLAB, pero parece que no puedo encontrar una biblioteca YAML para ese idioma. Revisé "matlab yaml" y "matlab yaml parse" en Google y no parece haber resultados relevantes. Una búsqueda de "yaml" en MATLAB Central también me dejó con las manos vacías.¿Ya hay una biblioteca/analizador YAML para MATLAB?

¿Realmente no existe una biblioteca YAML para MATLAB? Estoy de acuerdo con escribir uno, pero me gustaría evitar duplicar el trabajo. (¿Quizás algo para compartir?)

+1

¿Por qué quieres usar YAML? XML tiene mucho mejor soporte de idiomas cruzados. –

+1

¿Qué terminaste usando y cómo funcionó? Estoy en una situación similar y estaría interesado en escuchar. – AndyL

+0

Han surgido algunas otras cosas de alta prioridad, así que no he tenido la oportunidad de probar esto todavía. Si intentas algo antes que yo (lo publicaré), me gustaría saber cómo funciona. –

Respuesta

6

Extendí el código Jan para admitir más tipos de datos y para escribir desde un archivo matlab struct a yaml. No es sólo un archivo-m, por tanto, localicé las fuentes en las http://code.google.com/p/yamlmatlab/ Jiri

+0

Quiero usar leer YAML en clúster (-nojvm). Entonces, la dependencia de Java no es una opción. ¿Hay una versión MEX alrededor? –

3

Llame a las bibliotecas de importación Java YAML existentes de Matlab. Esto debería ser bastante directo. La interoperabilidad Java-Matlab es bastante buena, consulte la ayuda de matlab.

+0

Esa es una gran idea, ni siquiera se me ocurrió. ¿Los tipos de datos en Java se convertirán en los tipos apropiados en Matlab? Nunca te equivocaste con lo de Java mucho ... –

+0

Los tipos numéricos se convierten implícitamente, las cadenas deben convertirse explícitamente con cualquier celda (myJavaArray) para matrices o char (myJavaString), consulte la ayuda de Matlab, es bastante buena en este tema. – Mikhail

+3

Eche un vistazo a SnakeYAML (http://code.google.com/p/snakeyaml/wiki/readme) – Andrey

0

@AndyL Para sankeyaml, agréguelo a su javapath, luego importe ('org.yaml.snakeyaml.Yaml'), y funciona como los documentos; al LinkedHashMap resultante se accede más o menos como una estructura de matlab.

+0

¿Quisiste decir classpath by javapath? – izilotti

2

Creo que el siguiente ejemplo puede ahorrar algo de tiempo.

primer lugar usted necesita para cargar un documento YAML usando YAML serpiente:

javaaddpath C:\temp\snakeyaml-1.7.jar 
import('org.yaml.snakeyaml.Yaml') 

yamlreader = Yaml(); 
yml = fileread('C:\temp\test.yml'); 
jymlobj = yamlreader.load(yml); 

y después tendrá que acceder a los datos desde el objeto java, lo hice usando la siguiente rutina (tenga en cuenta que esto no es una rutina general y fue desarrollado para un tipo particular de archivos YAML, donde por ejemplo las matrices se definen como en Matlab)

function Data = Hash2Struct(hashMap) 

    Data = []; 

    iterator = hashMap.keySet().iterator(); 
    while (iterator.hasNext()) 
    field = iterator.next(); 
    if ~isempty(field) 
     d = hashMap.get(field); 
     switch class(d) 
      case {'java.util.LinkedHashMap'} 
       Data.(field) = Hash2Struct(d); 
      case {'java.util.ArrayList'} 
       Data.(field) = str2num(d.toString);    
      otherwise  
       Data.(field) = d; 
     end 
    end 
    end 

Buena suerte, ene

+2

Tuve que modificar el código de Jan para envolver la clave en java.lang.String() antes de que el hashMap devolviera el valor asociado con la clave. El resultado del método .get (campo), para mí siempre devolvería nada. Así que puede intentar cambiar la línea: d = hashMap.get (campo) a d = hashMap.get (java.lang.String (campo)), si tiene un problema similar. Eso supone que tu keySet es de tipo String, por supuesto. –

3

Ahora hay un envoltorio de MATLAB para snakeyaml:

http://code.google.com/p/yamlmatlab/

Yo lo he probado y funciona bastante bien en un archivo yaml simple. Hay errores si los nombres de campo yaml no son nombres de campo válidos y cuando las cadenas están vacías. He sugerido soluciones para ambos en la sección de problemas en el sitio del código de Google

+0

mi mal, perdí la respuesta de jirka – Marc

0

También hay implementación MEX por Geoffr Adams llamada mat-yaml con C vinculante para libyaml analizador-emisor).

Pero todavía no se puede compilar en Windows.

0

ZozaniDB Database Toolbox incluye una implementación Matlab-native para YAML (distribuida como archivos p).

>> s=yaml_dump(struct('name','apple','calories',53)) 

    s = 

name: apple 
calories: 53 

>> yaml_parse(s) 

ans = 
     name: 'apple' 
    calories: 53 
Cuestiones relacionadas