Está en la página 1de 15

DIRECCIONAMIENTO DE VECTORES Y MATRICES A PARTIR DE VECTORES

Los elementos de un vector x se pueden direccionar a partir de los de otro vector v. En este caso,
x(v) equivale al vector x(v(1)), x(v(2)), ... Considrese el siguiente ejemplo:
>> v=[1 3 4]
v =
1 3 4
>> x=rand(1,6)
x =
0.5899 0.4987 0.7351 0.9231 0.1449 0.9719
>> x(v)
ans =
0.5899 0.7351 0.9231
De forma anloga, los elementos de una matriz A pueden direccionarse a partir de los elementos de dos
vectores f y c. Vase por ejemplo:
>> f=[2 4]; c=[1 2];
>> A=magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> A(f,c)
ans =
5 11
4 14
El siguiente ejemplo continuacin del anterior permite comprobar cmo los elementos de
una matriz se pueden direccionar con un slo ndice, considerando que las columnas de la matriz
estn una a continuacin de otra formando un vector:
>> f=[1 3 5 7];
>> A(f), A(5), A(6)
ans =
16 9 2 7
ans =
2
ans =
11
Ms adelante se ver que esta forma de extraer elementos de un vector y/o de una matriz tiene
abundantes aplicaciones, por ejemplo la de modificar selectivamente esos elementos.
3.5.4. OPERADOR DOS PUNTOS (:)
Este operador es muy importante en MATLAB y puede usarse de varias formas. Se sugiere al lector
que practique mucho sobre los ejemplos contenidos en este apartado, introduciendo todas las
modificaciones que se le ocurran y haciendo pruebas abundantes (Probar es la mejor forma de
aprender!).
Para empezar, defnase un vector x con el siguiente comando:
>> x=1:10
x =
1 2 3 4 5 6 7 8 9 10 Captulo 3: Operaciones con matrices y vectores pgina 33
En cierta forma se podra decir que el operador (:) representa un rango: en este caso, los n-
meros enteros entre el 1 y el 10. Por defecto el incremento es 1, pero este operador puede tambin
utilizarse con otros valores enteros y reales, positivos o negativos. En este caso el incremento va
entre el valor inferior y el superior, en las formas que se muestran a continuacin:
>> x=1:2:10
x =
1 3 5 7 9
>> x=1:1.5:10
x =
1.0000 2.5000 4.0000 5.5000 7.0000 8.5000 10.0000
>> x=10:-1:1
x =
10 9 8 7 6 5 4 3 2 1
Puede verse que, por defecto, este operador produce vectores fila. Si se desea obtener un vector
columna basta trasponer el resultado. El siguiente ejemplo genera una tabla de funciones seno y
coseno. Ejectese y obsrvese el resultado (recurdese que con (;) despus de un comando el resultado
no aparece en pantalla).
>> x=[0.0:pi/50:2*pi]';
>> y=sin(x); z=cos(x);
>> [x y z]
El operador dos puntos (:) es an ms til y potente y tambin ms complicado con matrices. A
continuacin se va a definir una matriz A de tamao 66 y despus se realizarn diversas
operaciones sobre ella con el operador (:).
>> A=magic(6)
A =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
Recurdese que MATLAB accede a los elementos de una matriz por medio de los ndices de
fila y de columna encerrados entre parntesis y separados por una coma. Por ejemplo:
>> A(2,3)
ans =
7
El siguiente comando extrae los 4 primeros elementos de la 6 fila:
>> A(6, 1:4)
ans =
4 36 29 13
Los dos puntos aislados representan "todos los elementos". Por ejemplo, el siguiente comando
extrae todos los elementos de la 3 fila:
>> A(3, :)
ans =
31 9 2 22 27 20
Para acceder a la ltima fila o columna puede utilizarse la palabra end, en lugar del nmero
correspondiente. Por ejemplo, para extraer la sexta fila (la ltima) de la matriz:
>> A(end, :)
ans =
4 36 29 13 18 11 Aprenda Matlab 6.5 como si estuviera en Primero pgina 34
El siguiente comando extrae todos los elementos de las filas 3, 4 y 5:
>> A(3:5,:)
ans =
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
Se pueden extraer conjuntos disjuntos de filas utilizando corchetes [ ]. Por ejemplo, el siguiente
comando extrae las filas 1, 2 y 5:
>> A([1 2 5],:)
ans =
35 1 6 26 19 24
3 32 7 21 23 25
30 5 34 12 14 16
En los ejemplos anteriores se han extrado filas y no columnas por motivos del espacio ocupado por el
resultado en la hoja de papel. Es evidente que todo lo que se dice para filas vale para
columnas y viceversa: basta cambiar el orden de los ndices.
El operador dos puntos (:) puede utilizarse en ambos lados del operador (=). Por ejemplo, a
continuacin se va a definir una matriz identidad B de tamao 66 y se van a reemplazar filas de B
por filas de A. Obsrvese que la siguiente secuencia de comandos sustituye las filas 2, 4 y 5 de B
por las filas 1, 2 y 3 de A,
>> B=eye(size(A));
>> B([2 4 5],:)=A(1:3,:)
B =
1 0 0 0 0 0
35 1 6 26 19 24
0 0 1 0 0 0
3 32 7 21 23 25
31 9 2 22 27 20
0 0 0 0 0 1
Se pueden realizar operaciones an ms complicadas, tales como la siguiente8
:
>> B=eye(size(A));
>> B(1:2,:)=[0 1; 1 0]*B(1:2,:)
Como nuevo ejemplo, se va a ver la forma de invertir el orden de los elementos de un vector:
>> x=rand(1,5)
x =
0.9103 0.7622 0.2625 0.0475 0.7361
>> x=x(5:-1:1)
x =
0.7361 0.0475 0.2625 0.7622 0.9103
Obsrvese que por haber utilizado parntesis en vez de corchetes los valores generados por
el operador (:) afectan a los ndices del vector y no al valor de sus elementos.
Para invertir el orden de las columnas de una matriz se puede hacer lo siguiente:
>> A=magic(3)
A = 8 1 6 3 5 7 4 9 2 8
Se sustituyen las dos primeras filas de B por el producto de dichas filas por una matriz de permutacin.
Captulo 3: Operaciones con matrices y vectores pgina 35
>> A(:,3:-1:1)
ans = 6 1 8 7 5 3 2 9 4
aunque hubiera sido ms fcil utilizar la funcin fliplr(A), que es especfica para ello.
Finalmente, hay que decir que A(:) representa un vector columna con las columnas de A una
detrs de otra.
public void MetodoLu(){
int i,j;
double Y1,Y2,Y3,X1,X2,X3;
double A[][] = new double [3][3];
double L[][] = new double [3][3];
double U[][] = new double [3][3];
double B[] = new double [3];
System.out.println("\t\t\t\"METODO DE LU 3 ECUACIONES\"");
System.out.println("Ingrese coeficientes d");
for(i=0;i<3;i++)
{
System.out.println("Renglon "+(i+1));
for(j=0;j<3;j++)
{
System.out.println(" Ingrese a "+(i+1)+" "+(j+1));
A[i][j]=lee();
}
}
System.out.println("Ingrese los terminos independientes");
for(i=0;i<3;i++){
System.out.println("Termino "+(i+1));
B[i]=lee();
}
for(i=0;i<3;i++){
L[i][0]=A[i][0];
U[i][i]=1;
}
U[0][1]=A[0][1]/L[0][0];
L[1][1]=A[1][1]-L[1][0]*U[0][1];
L[2][1]=A[2][1]-L[2][0]*U[0][1];
U[0][2]=A[0][2]/L[0][0];
U[1][2]=(A[1][2]-L[1][0]*U[0][2])/L[1][1];
L[2][2]=A[2][2]-L[2][0]*U[0][2]-L[2][1]*U[1][2];
Y1=B[0]/L[0][0];
Y2=(B[1]-L[1][0]*Y1)/L[1][1];
Y3=(B[2]-L[2][0]*Y1-L[2][1]*Y2)/L[2][2];
X3=Y3;
X2=Y2-U[1][2]*X3;
X1=Y1-U[0][1]*X2-U[0][2]*X3;
System.out.println("El resultado es:\nx0= "+X1+" \nx1= " +X2+" \nx2= " +X3);
}

Este creo qe ya venia en las hojas qe te pase solo qe explica ah qe para aumentar a mas matrices se le
agregan los valores nada mas
Este es medio diferente Ejemplo: En este ejemplo se trata de efectuar el proceso de eliminacin
Gaussiana sobre una matriz 4x4, definiendo
todas las matrices Li
, por las que hay que multiplicar a izquierda a la matriz A para conseguir hacer ceros por debajo
de la diagonal.
A={{10,7,8,7},{7,5,6,5},{8,6,10,9},{7,5,9,10}};
Aoriginal=A;
A//MatrixForm
i
k
jjjjjjjjjjjj
10 7 8 7
756 5
8 6 10 9
7 5 9 10
y
{
zzzzzzzzzzzz
L1=IdentityMatrix[4];
For[i=2,i<=4,i++,L1[[i,1]]=-A[[i,1]]/A[[1,1]]]
MatrixForm[L1]
A=L1.A; MatrixForm[A] (* construccion de la primera matriz L1 *)
i
k
jjjjjjjjjjjjjjjj
1 000

7
cccccc 10 100

4
cccc5
010

7
cccccc 10 001
y
{
zzzzzzzzzzzzzzzz
i
k
jjjjjjjjjjjjjjjj
10 7 8 7
0
1
cccccc 10
2
cccc5
1
cccccc 10
0
2
cccc5
18
cccccc 5
17
cccccc 5
0
1
cccccc 10
17
cccccc 5
51
cccccc 10
y
{
zzzzzzzzzzzzzzzz
L2=IdentityMatrix[4];
For[i=3,i<=4,i++,L2[[i,2]]=-A[[i,2]]/A[[2,2]]]
MatrixForm[L2]
A=L2.A; MatrixForm[A] (* construccion de la segunda matriz L2 *)
i
k
jjjjjjjjjjjj
1 0 00
0 1 00
0 410
0 101
y
{
zzzzzzzzzzzz
i
k
jjjjjjjjjjjjj
10 7 8 7
0
1
cccccc 10
2
cccc5
1
cccccc 10
0023
0035
y
{
zzzzzzzzzzzzz
prac1.nb 6L3=IdentityMatrix[4];
For[i=4,i<=4,i++,L3[[i,3]]=-A[[i,3]]/A[[3,3]]]
MatrixForm[L3]
A=L3.A; MatrixForm[A] (* construccion de la tercera matriz L3 *)
i
k
jjjjjjjjjjjjj
10 0 0
01 0 0
00 1 0
0 0
3
cccc2
1
y
{
zzzzzzzzzzzzz
i
k
jjjjjjjjjjjjjjj
10 7 8 7
0
1
cccccc 10
2
cccc5
1
cccccc 10
0023
000 1
cccc2
y
{
zzzzzzzzzzzzzzz
U=A; L=Inverse[L3.L2.L1]; MatrixForm[L]; (* como las modificaciones las hemos
realizado sobre la matriz A, al final del proceso es triangular superior, y la
llamamos U *)
Aoriginal==L.U
True
Resolveremos ahora el sistema lineal con vector independiente {32,23,33,31} con la orden LinearSolve[]
y con la
implementacin directa de la frmula para comprobar que da la misma solucin
b={32,23,33,31};
LinearSolve[Aoriginal,b]
bb=L3.L2.L1.b;
dim=4;
x={0,0,0,0};
For[i=dim,i>=1,i--,
x[[i]]=(bb[[i]]-
Sum[A[[i,j]]*x[[j]],{j,i+1,dim}])/A[[i,i]]
]
Print[x]
81, 1, 1, 1<
81, 1, 1, 1<
A continuacin se trata de resolver un sistema lineal ligeramente modificado en el vector independiente
y ver lo que
ocurre.
prac1.nb 7b={32.1,22.9,33.1,30.9};
LinearSolve[Aoriginal,b]
bb=L3.L2.L1.b;
dim=4;
x={0,0,0,0};
For[i=dim,i>=1,i--,
x[[i]]=(bb[[i]]-
Sum[A[[i,j]]*x[[j]],{j,i+1,dim}])/A[[i,i]]
]
Print[x]
89.2, 12.6, 4.5, 1.1<
89.2, 12.6, 4.5, 1.1<
Ejercicio: Hacer lo mismo con la matriz de Hilbert 4x4 y vector independiente b={4,163/60, 21/10,
241/140} utilizando 4 decimales.
Ejercicio: Comprobar que la matriz A={{ 5, 1, 2},{1,8,3},{2,3,8}} es simtrica y puede factorizarse en la
forma LDLT
En este ejemplo vamos a ver cmo el no efectuar pivotaje lleva a una solucin bastante mala.
prac1.nb 8Clear[b,A,boriginal,Aoriginal,p]
b={1,1,1,1,1,1};
A={{p,-1,0,0,0,0},{0,p,-1,0,0,0},{0,0,p,-1,0,0},
{0,0,0,p,-1,0},{0,0,0,0,p,-1},{1,1,1,1,1,1}};
Aoriginal=A;
boriginal=b;
A//MatrixForm
p=10.^(-10);
i
k
jjjjjjjjjjjjjjjjjjjjjj
p 10 0 0 0
0 p 10 0 0
00 p 10 0
00 0 p 1 0
00 0 0 p 1
11 1 1 1 1
y
{
zzzzzzzzzzzzzzzzzzzzzz
El proceso de multiplicar a izquierda por las matrices Li
para realizar la factorizacin LU de una matriz puede
implementarse muy facilmente en Mathematica de la forma siguiente:
dim=6;
For[i=1,i<=dim,i++,
For[j=i+1,j<=dim,j++,
piv = -A[[j,i]]/A[[i,i]];
A[[j]] = A[[j]] + piv*A[[i]];
b[[j]] = b[[j]] + piv*b[[i]];
]
]
proceso de resolucin un sistema lineal con matriz triangular superior
x = Table@0, 8i, dim<D;
For@i = dim, i >= 1, i,
x@@iDD = Hb@@iDD
Sum@A@@i, kDDx@@kDD, 8k, i + 1, dim<DL A@@i, iDD
D
Print@N@xDD
88.264041032
, 8.264041022
, 8.264041012
, 827.404, 1., 1.<
Ahora vemos cmo de bien satisface la solucin calculada el sistema lineal
N[Aoriginal.x-boriginal]
81., 0.000976563, 0., 0., 0., 8.264041032
<
Si lo hacemos con la orden LinearSolve, que s que hace pivote, el resultado es bastante diferente
prac1.nb 9y=N[LinearSolve[Aoriginal,boriginal]]
Aoriginal.y-boriginal
86., 1., 1., 1., 1., 1.<
80., 0., 0., 0., 0., 0.<

También podría gustarte