Matlab - Convertir todos los vectores para que casen con la dimensión de RFS.

 
Vista:

Convertir todos los vectores para que casen con la dimensión de RFS.

Publicado por Axel (3 intervenciones) el 31/01/2023 17:37:37
Hola buenas tardes, tenia un duda en relación a un ejercicio que no soy capaz de resolver.

Tengo un fichero con los siguientes datos : RFS (matriz de 1024 filas y 5759 columnas), range (vector de 1024 filas), overflow(vector de 1024 filas), cal_x (vector de 5759 columnas) y scaling ( que es un numero que solo sirve para la formula).

Lo que quiero hacer es poder calcular la siguiente formula: señal= (RFS*overflow*cal_x*scaling)/(range^2)

Para hacer esto sin bucles, necesitamos convertir todos los vectores involucrados en la operación en matrices que casen con la dimensión de RFS y aplicar las operaciones correspondientes elemento a elemento.

He intentado hacer reshape, pero no encuentro la manera de poder hacer la operación de manera que casen todos los vectores.

Si alguien me puede echar una mano lo agradeceria.

Saludos.
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 Richtofen

Convertir todos los vectores para que casen con la dimensión de RFS.

Publicado por Richtofen (20 intervenciones) el 01/02/2023 14:08:29
Si quieres seguir esa formula a rajatabla tus dimensiones no son correctas, revisa los ficheros de entrada o donde saques esa información.

Date cuenta que vas a "dividir" una matriz por un vector. Cuando Matlab se encuentra con eso, revisa las dimensiones y hace la operación elemento a elemento por fila o columna dependiendo de dichas dimensiones. Un ejemplo con una matriz M de 3x3, un vector v1 de 1x3 y otro vector v2 de 3x1:

Cuando Matlab ejecute A ./ v1, lo que pasará será que como v1 tiene 3 columnas, los elementos de v1 irán diviendoa cada uno de su elemento correspondiente POR FILAS, es decir, primero se dividen los 3 elementos de la fila 1 de A por su correspondiente de v1, después los elementos de la fila 2 por los correspondientes de v1, e igualmente para la 3 fila.

Cuando Matlab ejecute A ./ v2, ocurrirá el caso anterior pero POR COLUMNAS, ya que ahora el vector v2 tiene 3 filas.


Ahora, sabiendo esto, vamos a tu caso. Tienes dos opciones pero no sé cual sería la buena porque no conozco tu ejercicio:

1. Ejecutar signal = ( RFS * cal_x.' * overflow.' .* scaling) ./ (range.^2); de tal manera que el primer término es de dimensión 1024x1024 y el segundo sigue siendo 1024x1, con lo cual obtendrás una matriz resultante de 1024x1024 que alberga el resultado de multiplicar cada columna del primer término por el valor correspondiente (los que tengan la misma posición) del segundo término

2. Si realmente lo que quieres hacer es resolver un sistema de ecuaciones, (RFS*overflow*cal_x*scaling)/(range^2) es equivalente a usar la función mrdivide, que realmente lo que haría sería resolverte el sistema x * (RFS*overflow*cal_x*scaling) = (range^2). Esto haría que por tanto solo tuvieras que hacer ( RFS * cal_x.' * overflow.' .* scaling) / (range.^2).', de tal manera que tu resultado es un vector de 1024 filas

Date cuenta que para que todo esto case hay que reordenar los términos de tu ecuación matricial, cosa que no suele estar bien ya que el orden con la multiplicacion de matrices es muy importante y no debe alterarse, pero repito, no sé todo el enunciado de tu ejercicio y quizás haya que revisar los valores de entrada, pero de la forma que te he explicado son las únicas formas que se me han ocurrido de realizar la operación que quieres.

Te dejo aquí un pequeño código con datos de valor aleatorio para justiificar el tema de las dimensiones de matrices y como casar lo que quieres:

1
2
3
4
5
6
7
8
9
RFS = randn(1024,5759);
range = randn(1024,1);
overflow = randn(1024,1);
cal_x = randn(1,5759);
scaling = randi(10,1);
% Element-wise division
signal_matrix = ( RFS * cal_x.' * overflow.' .* scaling) ./ (range.^2);
% Solving linear equation system
signal_vector = ( RFS * cal_x.' * overflow.' .* scaling) / (range.^2).';

Espero que te ayude.
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

Convertir todos los vectores para que casen con la dimensión de RFS.

Publicado por Axel (3 intervenciones) el 01/02/2023 14:48:58
Ya, yo también lo he hecho elemento a elemento pero no me da el resultado que me piden. Básicamente el enunciado dice así:

Lo que queremos hacer es recuperar la señal original (signal) que sería: señal= (RFS*overflow*cal_x*scaling)/(range^2)

Para hacer esto sin bucles, necesitamos convertir todos los vectores involucrados en la operación en matrices que casen con la dimensión de RFS y aplicar las operaciones correspondientes elemento a elemento. Luego me comenta que : Asigna a las variables filas y columnas las dimensiones de RFS. Esto te ayudará a convertir los vectores en matrices.
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 Richtofen

Convertir todos los vectores para que casen con la dimensión de RFS.

Publicado por Richtofen (20 intervenciones) el 01/02/2023 16:27:27
Por el contexto tiene pinta que estás haciendo cosas de DSP, y en esas cosas hay que tener mucho cuidado con los reshapes ya que si alteras la información de las matrices, las operaciones que realices te darán resultados que no tienen sentido fisico aunque ejecute el código y calcule algo.

Dicho esto, el que ha hecho el enunciado no tiene mucha idea de lo que pide si realmente quiere hacer un reshape de vectores a una dimension mayor (no puedes ajustar un vector de 1x1024 a las dimensiones de RFS), o bien las dimensiones con las que partes no son las adecuadas o hay una errata con la formula.

Si tu profe te explica algo más o te da más info sobre el problema no dudes en preguntar!
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