Matlab - Hacer un 'reshape' lo más eficientemente posible

 
Vista:
sin imagen de perfil
Val: 68
Ha aumentado 1 puesto en Matlab (en relación al último mes)
Gráfica de Matlab

Hacer un 'reshape' lo más eficientemente posible

Publicado por Aitor (49 intervenciones) el 25/10/2018 17:51:09
Buenas a todos,

Tengo actualmente un par de celdas de matrices que me necesitaría convertir a dos vectores (esto es, colocar todos los elementos de cada elemento de cada celda formando un vector), realizar una serie de operaciones con ellos y volver a dejarlos como se encontraban antes.

La única forma que se me ha ocurrido hasta ahora es utilizar un bucle para recorrer todos los elementos (matrices) de las dos celdas, hacerles un reshape a cada uno y luego un reshape a las celdas resultantes. A continuación trabajar con ambos vectores y finalmente hacer la misma operación en sentido opuesto: recorrer todos los elementos de ambos vectores y al alcanzar el último que pertenezca a un elemento de la celda, hacer el reshape que corresponda e insertarlo.

Me preguntaba si habría alguna forma más rápida de hacer esto, ya que necesito que mi programa sea lo más eficiente posible.

Un saludo y gracias por vuestra ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Hacer un 'reshape' lo más eficientemente posible

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 25/10/2018 18:24:19
la forma más eficiente sería utilizar un cellfun , podrías colocar un ejemplo o adjuntar tus archivos con la matriz que tienes actualmente y a lo que quieres llegar de esta forma obtienes una respuesta más adecuada
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 68
Ha aumentado 1 puesto en Matlab (en relación al último mes)
Gráfica de Matlab

Hacer un 'reshape' lo más eficientemente posible

Publicado por Aitor (49 intervenciones) el 25/10/2018 18:53:58
Buenas tardes Jesús,

Gracias por responder.

Te pondré un ejemplo. Voy a hacerlo con una sola celda, así resulta más sencillo de entender.

1
a = {[1 2 3 ; 4 5 6], [1 2 3 4]};

Necesitaría convertir esta celda, que contiene dos matrices de dimensiones 2x3 y 1x4, en un solo vector.

Para ello había pensado en hacer:
1
2
3
4
5
b = cell(size(a));
for i = 1 : length(a)
b{i} = reshape(a{i}, 1, []);
end
c = cell2mat(b);

Ahora podría operar tranquilamente sobre los elementos de c, y al acabar debería hacer la operación contraria, dejar todos los elementos de c como estaban al principio dentro de la celda a:
1
2
3
4
5
j = 0;
for i = 1 : length(b)
a{i} = reshape(c(j+1:j+length(b{i})), size(a{i}));
j = j + length(b{i});
end

Mi pregunta es: ¿existe una manera más eficiente de realizar todo este tejemaneje?

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Hacer un 'reshape' lo más eficientemente posible

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 25/10/2018 19:39:56
te podrías ahorrar esa conversión si determinas un patrón en las operaciones que vas a realizar que no especificaste en el foro, así tengas que colocar como vector la matriz lo ideal para que sea eficiente es que lo hagas sin hacer dicha conversión que planteas (así solucionas el problema de raíz) , de todas maneras para tamaños grandes te puede resultar un poco más eficiente pasar de A a C de la siguiente forma :

c=cellfun(@(x) reshape(x,1,[]),a,'Uni',false);
c=horzcat(bb{:});
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar