En Matlab, uno puede evaluar una cadena arbitraria como código usando la función eval. P.ej.

s = '{1, 2, ''hello''}'  % char
c = eval(s)              % cell

¿Hay alguna manera de hacer la operación inversa? obteniendo la representación de cadena literal de una variable arbitraria? Es decir, ¿recuperar s de c? Algo como

s = repr(c)

Dicha función repr está integrada en Python, pero no he encontrado nada parecido en Matlab, ni veo una forma clara de cómo implementarla yo mismo.

Lo más parecido que conozco es algo como disp(c) que imprime una representación de c, pero en un formato "legible" en lugar de un formato de código literal.

6
jmd_dk 28 oct. 2017 a las 23:39

3 respuestas

La mejor respuesta

Dependiendo exactamente de por qué quiere hacer esto, su caso de uso puede resolverse con matlab.io.saveVariablesToScript

Aquí es el documento para ello.

¡Espero que eso ayude!

2
Andy Campbell 2 nov. 2017 a las 14:57

OK, veo tu dolor.

Mi consejo aún sería proporcionar una función del tipo de toString apalancamiento en fprintf, sprint y amigos, pero entiendo que puede ser tedioso si no conoce el tipo de los datos y también requiere varias subcajas.

Para una solución rápida, puede usar evalc con el disp función que mencionaste.

Algo como esto debería funcionar:

function out = repr(x)
    out = evalc('disp(x)'); 
end

O sucintamente

repr = @(x) evalc('disp(x)');
3
jmd_dk 2 nov. 2017 a las 13:51

Lo más cercano que hay en Matlab es mat2str, que funciona para matrices 2D numéricas, de caracteres o lógicas (incluidos los vectores). (No funciona para matrices ND, matrices de celdas, matrices de estructura o tablas).

Ejemplos:

>> a = [1 2; 3 4]; ar = mat2str(a), isequal(eval(ar), a)
ar =
    '[1 2;3 4]'
ans =
  logical
   1

>> a = ['abc'; 'def']; ar = mat2str(a), isequal(eval(ar), a)
ar =
    '['abc';'def']'
ans =
  logical
   1

En esta preguntas y respuestas relacionadas puede ver:

  • Una función que escribí para obtener una representación de cadena de matrices de celdas 2D con celdas anidadas arbitrariamente, matrices numéricas, de caracteres o lógicas.
  • Cómo hacer lo que quieres en Octave para tipos de datos arbitrarios.
7
Luis Mendo 29 oct. 2017 a las 03:10