2012-10-09 32 views
7

Busco una función en Matlab para los mensajes de error, así:¿Hay una función de Matlab para convertir cualquier estructura de datos en una cadena?

error(['Invalid value for someVariable: ' wantedFunction(someVariable)]); 

Quiero wantedFunction para poder tomar las dos cadenas, matrices, matrices de células, lo ideal sería incluso un conjunto de estructuras.

Por ahora, estoy usando num2str, pero eso no funciona para las células. Pensé que lo que quería se podía hacer con sprintf, pero no he descubierto cómo. Supongo que podría escribir mi propia función, pero sería redundante si ya hay una forma de hacerlo en Matlab. ¿Algunas ideas?

+1

Mira mi última edición (toString.m). Esta es la versión que se colocará en el intercambio de archivos una vez aprobada. –

Respuesta

14

Sí, aunque no es sencillo. Usted tiene que utilizar el disp en combinación con evalc:

string = evalc(['disp(someVariable)']) 

Se podía jugar esta en una forma más manejable:

toString = @(var) evalc(['disp(var)']); 

Así que, por su ejemplo:

>> var = {rand(3,1), 'A', struct('test', 5)}; 
>> error(['Invalid value for var: ' toString(var)]) 

??? Invalid value for var:  [3x1 double] 'A' [1x1 struct] 
+0

¡Gracias! Esto es lo que estaba buscando: la forma más sencilla de hacerlo. Para evitar hacer una función homebrew toString (ya sea una línea o una función completa), creo que se podría hacer: 'disp (someVariable); error ('... es un valor inválido para someVariable'); ' – Nagel

+0

Terminé usando la función en su otra respuesta, aunque :) – Nagel

+1

Esto no imprimirá las estructuras de los nidos – Dims

2

No, no hay tal función. Me encontré con problemas similares, así que aquí hay una función muy rudimentaria que uso. Comprenda que no está completo. Por ejemplo, no genera campos de una estructura de manera significativa, pero puede agregarse fácilmente. Puede tratarlo como una implementación básica y ajustarlo a sus necesidades.

function ret = all2str(param) 
if isempty(param) 
    if iscell(param) 
     ret = '(empty cell)'; 
    elseif isstruct(param); 
     ret = '(empty struct)'; 
    else 
     ret = '(empty)'; 
    end 
    return; 
end 

if ischar(param) 
    ret = param; 
    return; 
end 

if isnumeric(param) 
    ret = num2str(param); 
    return; 
end 

if iscell(param) 
    ret = all2str(param{1}); 
    for i=2:numel(param) 
     ret = [ret ', ' all2str(param{i})]; 
    end 
    return; 
end 

if isstruct(param) 
    ret = '(structure)'; 
    return; 
end 
end 
+0

Hmmm ... No parece que tenga 'mall2str' ... ¿es un problema R2012? Además: ¿por qué no imprimes la estructura usando 'fieldnames', etc.? ¿Y por qué no imprimes ''[]'' o ''{}'' para vacíos? –

+0

@RodyOldenhuis No lo tiene, porque lo escribí para uso interno. De ninguna manera es perfecto. Como dije en mi respuesta, no manejo las estructuras. Porque nunca necesité esa característica en particular;) Pero claro, puede implementarse fácilmente. Las cosas que imprimí fueron convenientes para mí. – angainor

+0

@RodyOldenhuis ow, hubo un error tipográfico allí. Cambié el nombre de 'mall2str' a' all2str', pero no en todas partes ... Gracias – angainor

2

Ahora que lo pienso de eso, recuerdo haber hecho algo hace mucho tiempo bastante similar a lo que Angainor ha hecho en su respuesta. Lo publicaré aquí para cualquier persona interesada en convertir elementos arbitrarios en cadenas y, en general, tener más control sobre cómo se realiza esa conversión.

Admite vaciados, lógicos, caracteres, identificadores de función, numéricos, celdas, struct (matrices) y clases definidas por el usuario (matrices dispersas en la próxima actualización).

EDIT: He tomado esto como una plantilla para una actualización que terminé colocando en el file exchange. Siéntase libre de experimentarlo y modificarlo para adaptarlo a sus necesidades.

+1

+1 Empiezan de manera similar, solo me di por vencido justo después del comienzo, mientras que parece que lo has empujado un poco más;) – angainor

+0

¡Genial! Supongo que esta es la función a usar si uno quiere hacerlo correctamente, entonces. – Nagel

+0

¡Genial! Con mucho gusto lo usaré. Hiciste bastante trabajo en eso ... Ahora una función como esa finalmente existe :) – angainor

0

parecer extraño, pero

str = matlab.unittest.diagnostics.ConstraintDiagnostic.getDisplayableString(value) 

hace el trabajo para usted en lugar de utilizar que evalc(disp()) enfoque.

Cuestiones relacionadas