Matlab - como suma matriz con vector.?

 
Vista:

como suma matriz con vector.?

Publicado por luis (7 intervenciones) el 22/02/2011 21:32:15
Necesito de una ayuda.. nose si es posible con operadores directos de matlab.. pero quisiera saber lo siguiente:

Tengo una matriz A(5,4)
y un vector V(5)

quisiera un operador para sumar el vector en la matriz..
o sea
cada valor del vecto que vaye en cada valor de la matriz.

EJ:

A =

4 5 6 7
6 3 5 12
12 8 6 14
8 6 7 0
0 18 2 15

V =

4 17 25 4 6

Resultado

ans =

8 9 10 11
23 20 22 29
37 33 31 39
12 10 11 4
6 24 8 21

Algun operador que no utilize bucle.. o sea.. sin for o while..?? o solo con esos operadores es posible..?? gracias por su atencion.
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

RE:como suma matriz con vector.?

Publicado por Jorge (226 intervenciones) el 22/02/2011 23:39:21
No puedes sumar matrices de diferente tamaño.

Debes modificar V para que tenga un tamaño igual a A (con repmat) y después puedes sumar elemento por elemento

V =[4 17 25 4 6]'
vr = repmat(V, 1, 4)

A + vr
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

RE:como suma matriz con vector.?

Publicado por luis (7 intervenciones) el 23/02/2011 04:32:42
muchas gracias.. lo voy a pobar.. pero en realidad el problema es mas complicado.. solo lo resumi.. ahora ya se como solucionar...

en realidad yo tengo asi:

for j=1:24
g(j)=0;
for (n=1:78)
gi(n,j)=0;
gi(n,j)=((vec1(j)+vec2(n)-mat1(n,j))/(2*mat2(n,j)));
g(j)=g(j)+gi(n,j);
end
end

donde:

vec1(24)
vec2(78)
mat1(78,24)
mat2(78,24)

todos los valores de los vectores y de las matrices cambian cada ves que se ejecuta esta operacion; y se ejecuta como 200 veces.. y ahora YA SE COMO SOLUCIONAR.

Tengo un programa que estoy mejorando, esta lleno de bucles (for, while), estoy aprendiendo a usar matlab y estoy sacando muchos bucles, hay algunos muy complicados como el mostrado mas arriba.

Ahora mis preguntas son las siguientes:

1.- Que me conviene? realizar esa operacion que me diste o seguir con este bucle.? ya que mi objetivo es ganar tiempo. y como lo realizo en un software libre (octave), tarda mucho tiempo.

2.- Gano tiempo con reemplazar los blucles por librerias propias de matlab.? siendo que, hasta sumas de matrices se hace con blucles, siendo que matlab tiene librerias que realizan en forma directa.

3.- Tengo mas bucles complicados, me ayudarian..?? es largo y un poco complicado de comprender.

PD: No te preocupes por la solucion de este bucle que puse aqui.. ya se como hacer.. solo necesitaba de lo que habia pedido anteriormente.
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

RE:como suma matriz con vector.?

Publicado por Jorge (226 intervenciones) el 23/02/2011 08:32:43
El trabajo en iteraciones es relativamente lento.
Las operaciones vectorizadas son mucho más rápidas.

En Matlab y Octave (además de Scilab y FreeMat, entre otros) puedes trabajar con vectores y matrices directamente, cuando la lógica lo permite. Tienes que asegurarte de que las operaciones están definidas con las dimensiones matriciales correctas.

Querer llevar a cabo operaciones con matrices o vectores que no tienen las dimensiones correctas, es un error típico.

Puedes transponer matrices con un apóstrofe después de la matriz

Si A es una matriz de 78 x 24, A' es una matriz de 24 x 78
Si V es un renglón, V' es una columna.

Algo similar a esto debe funcionarte en lugar de los bucles:

v1 = repmat(vec1,1, 78)';
v2 = repmat(vec2, 1, 24);
gi = v2 + v1 - mat1 ./ (2 * mat2);

Nota la simplicidad del código vectorizado.

Si tienes problemas con esto, mi sugerencia sería que probaras con matrices más chicas, para que depures el algoritmo, y después extiendes el concepto al tamaño que desees.

Puedes verificar el tamaño de cualquier matriz con la función 'size'.
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

RE:como suma matriz con vector.?

Publicado por luis (7 intervenciones) el 23/02/2011 15:10:43
Muchas gracias.. pero lo que realmente quiero saber son:

1.- Es conveniente trabajar con bucles, como lo he mostrado anteriormente, o con la libreria de matlab.?

2.- Se gana tiempo al reemplazar los blucles por las librerias que utiliza matlab (repmat, find, etc)..??

Estas preguntas me gustaria saber para continuar eliminando blucles o dejar asi como esta.. siendo que hay dos blucles que, si consigo reemplazar con librerias de matlab, son las que lentizan mas el programa..

Gracias por su atencion.
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

RE:como suma matriz con vector.?

Publicado por Jorge (226 intervenciones) el 23/02/2011 21:42:14
Sí.
Es más rápido trabajar con matrices completas que con bucles.

A eso es a lo que se llama vectorización.
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

RE:como suma matriz con vector.?

Publicado por luis (7 intervenciones) el 24/02/2011 01:08:49
ok man.. muchas gracias.. entonces continuo con mis dos ultimos bucles que no estoy consiguiendo eliminar.. busque mucho.. y solo consigo matrices binarias..

for(f=1:end)
if mat1(f,c)<=MatMin(f,c)
mat1(f,c)=MatMin(f,c);
end
if mat1(f,c)>=MatMax(f,c);
mat1(f,c)=MatMax(f,c);
end
end

este bucle consiste en 3 matrices:
mat1= donde poseo valores que se calcula, pero esto valores poseen límites y estos límites estan contenidos en otras dos matrices, que son:
MatMin = contiene valores minimos que debe haber en la mat1,
MatMax = contiene valores maximos que debe haber en la mat1,

existe alguna libreria que podria hacerme esa comparacion de valor por valor y si cumple con la condicion, que sea reemplazada en la mat1.

Gracias por la ayuda..
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

RE:como suma matriz con vector.?

Publicado por Jorge (226 intervenciones) el 24/02/2011 07:40:58
Bueno, yo esperaría que el valor máximo de una matriz fuera un escalar, no otra matriz.

Supón que tuvieras

A = [
1 2 3 4 5
4 3 5 6 8
8 7 9 8 9]

y quisieras convertir a 7 todos los elementos mayores a 7, entonces, con find(A > 7) encuentras los índices correctos y luego les asignas el valor apropiado

A( find(A > 7) ) = 7

no necesitas bucles.
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

RE:como suma matriz con vector.?

Publicado por luis (7 intervenciones) el 24/02/2011 13:41:43
Lastimosamente, en el caso anterior si son matrices... donde:


MatMin =
[ 2 3 4 4 6
3 4 2 2 5
4 5 2 4 4
2 2 6 5 6 ]

MatMax =
[ 18 19 18 20 21
15 17 15 22 20
21 22 21 22 22
18 20 18 19 20]

mat1 =
[ 12 15 45 50 2
8 4 1 20 14
25 4 24 46 3
19 15 5 22 6 ]

for (c=1:5)
for(f=1:4)
if mat1(f,c)<=MatMin(f,c)
mat1(f,c)=MatMin(f,c);
end
if mat1(f,c)>=MatMax(f,c);
mat1(f,c)=MatMax(f,c);
end
end
end

mat1 =

12 15 18 20 6
8 4 2 20 14
21 5 21 22 4
18 15 6 19 6

Creo que, para esta operacion, no se tiene una vectorizacion.. no es asi..??
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

RE:como suma matriz con vector.?

Publicado por Jorge (226 intervenciones) el 24/02/2011 21:40:22
Una línea para máximos y otra para mínimos. Así:

mat1(find(mat1 < MatMin)) = MatMin(mat1 < MatMin);
mat1(find(mat1 > MatMax)) = MatMax(mat1 > MatMax);
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

RE:como suma matriz con vector.?

Publicado por luis (7 intervenciones) el 25/02/2011 00:06:45
esta excelente. gracias man. asi mismo hice. muchas gracias. ya estoy comenzando a dominar este programa. muchas gracias por tu ayuda.
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