Lo nuevo en Matlab viene de C / C ++ ......
Tengo una matriz de objetos y estoy tratando de acceder a los valores de cada objeto en la matriz y concatenarlos en una variable.
Class sample
properties(GetAccess = "public", SetAccess ="public")
ID;
Value;
end
methods
function obj = sample(id, value)
obj.ID = id;
obj.Value = value;
end
end
end
Luego hago una matriz que contiene algunos de los objetos.
x = sample.empty(3,0);
x(1) = sample(1,3);
x(2) = sample(1,4);
x(3) = sample(1,5);
Luego quiero obtener todos los valores de los objetos y almacenarlos en una nueva matriz.
y = x(:).Value;
Sin embargo, esto falla y solo pone el valor de x (3) en y ..... y:
y(:) = x(:).Value;
Lanza un error.
Cualquier ayuda sería apreciada. Sé que podría hacer esto con bucles, pero estoy tratando de hacerlo de la manera más rápida y eficiente.
Respuestas
5 para la respuesta № 1Simple pero no intuitivo
y=[x.Value]
¿Por qué? Bien x.Value
no es un bloque de memoria contiguo, por lo que no se puede asignar directamente a una matriz. Vocación x.Value
devuelve el miembro de datos de valor de cada uno x
objeto a su vez. Matlab trata esto como operaciones separadas. Al encerrar la llamada en []
le está diciendo a matlab que formule una matriz contigua concatenando cada resultado. Esto puede ser asignado a una serie de dobles, y
.
EDITAR:
Con respecto a su comentario, el código anterior funciona bien si x es de diferente longitud en diferentes objetos, es decir. .
x(1) = sample(1,3);
x(2) = sample(1,[4 5 6]);
x(3) = sample(1,[20 10]);
Entonces
>> [x.Value]
ans =
3 4 5 6 20 10
Si quiere decir que desea que "y" sea un vector de final irregular, como es posible con un vector de vectores en C ++, debe usar la notación de matriz de celdas (llaves)
>> y = {x.Value}
y =
[3] [1x3 double] [1x2 double]