Вы находитесь на странице: 1из 147

"#$%&'())*+# , -, .

%&/%,0,)*+# )&#
123425
67 898%)*)*&: %8:(8-$&: )&# ;,%*,: :&-()*&#8:< $&',:
)-,%,08#$8 8=.-*),',:



1,),%*& >&-& ?:,&-,
>%&@8:&% 3*$(-,% '8 48#/(,98: A B*:$80,: "#@&%0C$*)&: 8# -,
?#*;8%:*',' '8 D,:$*--,E4, 1,#)F,


1






















Nacaiio Polo 0saola, 2u12
macaiio.pologmail.com

1
GHI"DJ IJ JKJLD"D"MB
Ejeicicio 1. Factoiial iteiativo ........................................................................................................ 1
Ejeicicio 2. Nmeio combinatoiio ............................................................................................... 7
Ejeicicio S. e
x
poi Tayloi .................................................................................................................. 9
Ejeicicio 4. seno{x) poi Tayloi .................................................................................................... 1S
Ejeicicio S. Factoiial iecuisivo ................................................................................................... 14
Ejeicicio 6. Iibonocci ...................................................................................................................... 16
Ejeicicio 7. La uivina piopoicion ............................................................................................... 19
Ejeicicio 8. Conveision ue enteio a binaiio .......................................................................... 2u
Ejeicicio 9. Contauoi ue apaiiciones ....................................................................................... 2S
Ejeicicio 1u. Piouucto escalai .................................................................................................... 28
Ejeicicio 11. Fibonacci en un vectoi ........................................................................................ S1
Ejeicicio 12. Bistancia al piimeio ............................................................................................. SS
Ejeicicio 1S. Nmeios piimos .................................................................................................... 41
Ejeicicio 14. vectoi con los n piimeios nmeios piimos ............................................... 44
Ejeicicio 1S. vectoi con los n piimeios nmeios piimos oiuenauos ue mayoi a
menoi 46
Ejeicicio 16. Calculai el ensimo nmeio piimo ................................................................ 48
Ejeicicio 17. Contai nmeios uistintos en un vectoi ....................................................... 49
Ejeicicio 18. Bescomposicion en factoies piimos (I) ....................................................... Su
Ejeicicio 19. Bescomposicion en factoies piimos (II) ...................................................... S2
Ejeicicio 2u. Nximo comn uivisoi ........................................................................................ S4
Ejeicicio 21. Tableio ue ajeuiez ................................................................................................. S6
Ejeicicio 22. Alfil ............................................................................................................................... S7
Ejeicicio 2S. El caballo ue ajeuiez ............................................................................................. 61
Ejeicicio 24. Natiiz iuentiuau ..................................................................................................... 68
Ejeicicio 2S. Biagonal piincipal ................................................................................................. 7u
Ejeicicio 26. Tiaza ue una matiiz .............................................................................................. 7S
Ejeicicio 27. 0nos y ceios alteinauos ...................................................................................... 7S
Hocorio Polo 0soolo
2
Ejeicicio 28. Natiiz ue vanueimonue ..................................................................................... 81
Ejeicicio 29. Natiiz ue Fibonacci ............................................................................................... 8S
Ejeicicio Su. Piouucto ue matiices. .......................................................................................... 8S
Ejeicicio S1. Tiingulo ue Taitaglia ......................................................................................... 87
Ejeicicio S2. Tiingulo equilteio ............................................................................................. 9u
Ejeicicio SS. Natiiz tiiangulai supeiioi ................................................................................. 9S
Ejeicicio S4. Biagonales que se inciementan (I) ................................................................ 99
Ejeicicio SS. Biagonales que se inciementan (II) ............................................................. 1u2
Ejeicicio S6. Nmeios oiuenauos ........................................................................................... 1uS
Ejeicicio S7. Nmeios oiuenauos uescenuentemente .................................................. 1uS
Ejeicicio S8. Zigzag ........................................................................................................................ 1u6
Ejeicicio S9. Bistancias ................................................................................................................ 1u7
Ejeicicio 4u. Bistancia en letias ............................................................................................... 111
Ejeicicio 41. Buscauoi ue cauenas .......................................................................................... 11S
Ejeicicio 42. Beteccion ue palinuiomos ............................................................................... 11S
Ejeicicio 4S. El monte ................................................................................................................... 124
Ejeicicio 44. Clculo ue pi () ................................................................................................... 129
Ejeicicio 4S. La saliua uel labeiinto ....................................................................................... 1SS
Ejeicicio 46. Bsqueua binaiia ................................................................................................. 1S7
46 ejercicios resueltos Je HATlAB
1
J98%)*)*& NO P,)$&%*,- *$8%,$*;&
L8,-*Q,% (#, @(#)*+# R(8< %8)*S*8#'& )&0& ,%/(08#$& '8 8#$%,', (# #T08%&
8#$8%& n< '8;(8-;, 8- @,)$&%*,- '8 '*)F& #T08%&O
!" $% &' (')"*"'&' $"$+,$ -(+./'$0% 1' '$0(-1- &' 1'*'(2 1'3%43'( .$ EN A
0&:$%,% (# 08#:,98 '8 ,;*:& .&% .,#$,--,O B* n !"#$% '#()$ *"# +#$) ,#
!"#"$% !"'()'"$ *+,#-./ 0/ EN A 0&:$%,% (# 08#:,98 '8 ,;*:& .&% .,#$,--,O
B* n !" $%&'( &!)&'" *& +&,&'- '&+"!+&(' .(/0( 1O

El factoiial ue un nmeio natuial n es el piouucto ue touos los nmeios natuiales
uesue 1 hasta ese nmeio n. El factoiial ue S, poi ejemplo, es 12S4S=12u.
Auems, el factoiial ue u es 1. La funcion factoiial se iepiesenta con una
aumiiacion: n!=n{n-1).S21.
Solucion 1.
En una piimeia solucion suponuiemos que el nmeio que se pasa como
aigumento a la funcion es natuial y positivo. Paia computai el iesultauo
necesitamos nicamente un bucle for que vaya uesue 1 hasta n ue 1 en 1 (Funcion
1): a la funcion la hemos llamauo foctoriol1 y toma un aigumento
1
n.
function result = factorial1( n )
result=1;
for i=1:1:n
result=result*i;
end
end

P(#)*+# NO ?# @,)$&%*,- :8#)*--&< :*# )&0.%&S,)*+# '8 .,%C08$%&: A )&# (# for R(8 *#)%808#$,
El bucle for i=1:1:n inicializa la vaiiable contauoi i a 1 y la va inciementanuo ue 1
en 1 hasta n (el valoi uel aigumento pasauo). En el cueipo uel bucle se utiliza una
vaiiable acumulauoia result (pueue llamaise ue cualquiei maneia, peio
utilizaiemos habitualmente result paia hacei iefeiencia al iesultauo que uebe
uevolvei la funcion) en la que iiemos guaiuanuo el iesultauo ue calculai el valoi
anteiioi ue result multiplicauo poi el valoi ue i. Con objeto ue que result vaya
almacenanuo coiiectamente los valoies, es necesaiio inicializaila a 1 antes ue
empezai el bucle.
La Tabla 1 muestia una tiaza ue ejecucion ue la funcion cuanuo pasamos S como
valoi uel paimetio n: al entiai a la funcion, ni result ni i tienen valoi, y lo nico
que est uefiniuo es el paimetio n. En la asignacion result=1 que hay antes uel
bucle, result toma el valoi 1 peio i sigue sin estai uefiniua. Al entiai al bucle poi
piimeia vez, result sigue valienuo 1 e i toma ya valoi 1.

1
orqumento y pormetro significan lo mismo. 0tilizaiemos ambas palabias
inuistintamente.
Hocorio Polo 0soolo
2
En la segunua vuelta al bucle, i se ha inciementauo en 1, con lo que vale 2, y a result
le asignamos el valoi que tenia (1) multiplicauo poi el valoi ue i: la apaiicion ue la
palabia result en el lauo ueiecho ue la instiuccion result=result*i hace iefeiencia al
valoi actual ue result; la apaiicion ue result en el lauo izquieiuo hace iefeiencia al
valoi que le vamos a asignai.
Se contina ue esta maneia, hacienuo ese computo, hasta que i alcance el valoi S,
que es el valoi ue n que pasamos como paimetio y que es la conuicion ue paiaua
en el bucle for: for i=1:1:n
D&08#$,%*&: # %8:(-$ *
Al entiai a la funcion S
Al ejecutai result=1 S 1
La piimeia vez que entiamos al bucle S iesult=iesult*i
iesult=1*1=1
1
Segunua vuelta al bucle S iesult=iesult*i
iesult=1*2=2
2
S iesult=2*S=6 S
S iesult=6*4=24 4
S iesult=24*S=12u S
3,S-, N
Si ejecutamos la funcion uesue la linea ue comanuo, obtenemos esto:
>> factoiial1(S)

ans =

12u
P*/(%, N
La palabia ons que esciibe NATLAB es la onswer (la iespuesta) al clculo que le
hemos solicitauo. Nuestia un 12u poique, en la cabeceia ue la funcion
asignbamos a result el iesultauo ue la funcion, y piecisamente es result la vaiiable
en la que vamos, iteiacion a iteiacion, almacenanuo el iesultauo que ueseamos.
function result = factorial1( n )
Solucion 2.
0tia foima ue implementai exactamente lo mismo es utilizai tambin un bucle for,
peio que vaya uesue n hasta 1, ue -1 en -1. 0bseiva (Funcion 2) que el bucle for ha
cambiauo:
function result = factorial2( n )
result=1;
for i=n:-1:1
result=result*i;
end
end

P(#)*+# UO ?# @,)$&%*,- :8#)*--&< :*# )&0.%&S,)*+# '8 .,%C08$%&: A )&# (# for R(8 '8)%808#$,
46 ejercicios resueltos Je HATlAB
S
Solucion S.
En el enunciauo uel pioblema nos piuen que, si no pasamos ningn aigumento, se
muestie un mensaje ue aviso poi pantalla. Ahoia mismo se muestia el mensaje ue
eiioi poi uefecto ue NATLAB, que es bastante feo:
>> factoiial2()
... Input aigument "n" is unuefineu.

Eiioi in ==> factoiial2 at S
foi i=n:-1:1
P*/(%, U
Nouificaiemos ligeiamente la funcion paia que se compiuebe que se pasan
aigumentos y que, en caso ue que no sea asi, se muestie un mensaje ue eiioi
peisonalizauo, la funcion uevuelva 1 y el piogiama teimine: en la Funcion S hemos
aauiuo unas lineas ue couigo en las que usamos la palabia ieseivaua norqin (que
inuica el nmeio ue valoies pasauos a la funcion como paimetios) paia
compiobai que, si es u, el iesultauo ue la funcion sea -1 (nos lo piue el enunciauo),
se muestie un mensaje ue eiioi (uso ue la funcion Jisp ue NATLAB) y el piogiama
teimine (uso ue return).
function result = factorial2( n )
if (nargin==0)
result=-1;
disp('Debes dar un argumento a la funcin');
return;
end

result=1;
for i=n:-1:1
result=result*i;
end
end

P(#)*+# VO J- @,)$&%*,- )&# )&0.%&S,)*+# '8- #T08%& '8 .,%C08$%&:
Ahoia, el iesultauo ue llamai a la funcion sin aigumentos es:
>> factoiial2()
Bebes uai un aigumento a la funcion

ans =

-1
P*/(%, V
Solucion 4.
El enunciauo tambin nos uice que, si n es menoi que ceio, se u un mensaje ue
aviso y se uevuelva tambin -1. 0na foima ue haceilo es aauii otio if uespus uel
if que ya aauimos a la Funcion S, ue maneia que el couigo queue como en la
Funcion 4:
Hocorio Polo 0soolo
4
function result = factorial2( n )
if (nargin==0)
result=-1;
disp('Debes dar un argumento a la funcin');
return;
end

if (n<0)
result=-1;
disp('El parmetro debe ser positivo');
return;
end

result=1;
for i=n:-1:1
result=result*i;
end
end


P(#)*+# 6
Si intentamos calculai, poi ejemplo, el factoiial ue -S, se muestia la siguiente
iespuesta:

>> factoiial2(-S)
El paimetio uebe sei positivo

ans =

-1
P*/(%, 6
Solucion S.
0tia foima ue conseguii lo mismo que en la solucion anteiioi es colocai las uos
compiobaciones (existencia ue un aigumento y que ste sea positivo) en un solo if:
en la Funcion S unimos ambas conuiciones con un or (simbolo |, la baiia veitical),
ue maneia que si el nmeio ue aigumentos es u o n es menoi que ceio, la funcion
uevuelva -1, se muestie un mensaje ue eiioi y se teimine el clculo.
46 ejercicios resueltos Je HATlAB
S
function result = factorial2( n )
if (nargin==0 | n<0)
result=-1;
disp('Debes dar un argumento positivo a la funcin');
return;
end

result=1;
for i=n:-1:1
result=result*i;
end
end

P(#)*+# W
Solucion 6.
Nos piuen en el enunciauo, poi ltimo, que si n no fueia enteio se ieuonuee hacia +
: es uecii, si queiemos calculai el factoiial ue 7.8S, uevolveiemos el factoiial ue 8.
0na vez compiobauo que hay un aigumento positivo, utilizaiemos la funcion
ceil{x) ue NATLAB: si x tiene uecimales, ceil{x) ieuonuea el valoi ue x hacia el
enteio supeiioi ms pioximo; si no los tiene, ueja el valoi ue x como est.
function result = factorial2( n )
if (nargin==0 | n<0)
result=-1;
disp('Debes dar un argumento positivo a la funcin');
return;
end

n=ceil(n);

result=1;
for i=n:-1:1
result=result*i;
end
end
P(#)*+# 7
Ahoia, la funcion se compoita coiiectamente:

Hocorio Polo 0soolo
6
>> factoiial2(4.S)

ans =

12u

>> factoiial(S)

ans =

12u

P*/(%, W

46 ejercicios resueltos Je HATlAB
7
J98%)*)*& UO HT08%& )&0S*#,$&%*&
J:)%*S*% (#, @(#)*+# R(8 ),-)(-8 8- #T08%& )&0S*#,$&%*&
!
!
< :,S*8#'& R(8
n>=m,
!
!
!
!
!
! ! A R(8
!
!
!
!!
!!! !!! !
O 4&: ;,-&%8: '8 n A m :8%C#
,%/(08#$&: '8 8#$%,', A 8- %8:(-$,'& '8- )C-)(-& :8 '8;&-;8%C )&0&
,%/(08#$& '8 :,-*',O
Solucion 1.
Esciibiiemos piimeio una solucion algo laiga, peio en la que se iealiza touo el
clculo: en los piimeios ties if (maicauos en amaiillo) hacemos una compiobacion
ue los aigumentos. En el siguiente compiobamos si m es u o si n==m, con lo que
uebemos uevolvei 1 como iesultauo.
En los siguientes ties bloques calculamos los factoiiales ue n, m y ue n-m usanuo
ties bucles for como los que ya utilizamos en la piimeia solucion a la funcion
factoiial (pgina 1). Estos factoiiales los guaiuamos en ties vaiiables llamauas
foctoriolN, foctoriolH y foctoriolNmenosH. Finalmente, asignamos a la vaiiable ue
iesultauo (result) el clculo solicitauo.
function result = numeroCombinatorio1( n, m )
if (nargin~=2)
disp('Se necesitan dos argumentos');
return;
end

if (n<0 | m<0)
disp('Los argumentos deben ser positivos');
return;
end

if (n<m)
disp('n debe ser mayor o igual que m');
return;
end

if (n==m | m==0)
result=1;
return;
end

factorialN=1;
for i=1:1:n
factorialN=factorialN*i;
end

factorialM=1;
for i=1:1:m
factorialM=factorialM*i;
end

factorialNmenosM=1;
for i=1:1:(n-m)
factorialNmenosM=factorialNmenosM*i;
Hocorio Polo 0soolo
8
end

result=factorialN/(factorialM*factorialNmenosM);
end

P(#)*+# X
Solucion 2.
En una solucion menos complicaua pouemos utilizai cualquieia ue las funciones
factoiial que esciibimos como soluciones uel ejeicicio 1. Basta con esciibii una
nueva funcion en la que las llamamos:
function result = numeroCombinatorio2( n, m )
result=factorial1(n)/(factorial1(m)*factorial1(n-m))
end

P(#)*+# Y
Solucion S.
En las uos soluciones anteiioies iepetimos clculos. Supongamos que nos piuen
calculai
!"
!
: calculamos piimeio foctoriolN=109876S4S21 y luego
computamos foctoriolH=S4S21, con lo que estamos iepitienuo paite uel clculo
uel foctoriolN.
Si uebiiamos hacei este clculo a mano, piobablemente calculaiiamos piimeio el
factoiial ue m y luego, al calculai el ue n, nos uetenuiiamos al llegai al valoi ue m.
Es uecii, que foctoriolN=109876foctoriolH. Esto es lo que hacemos en esta
solucion (Funcion 9), que iequieie menos tiempo ue computo: en la piimeia linea
se calcula el factoiial ue m; luego, en el bucle for iesaltauo en amaiillo, vamos
guaiuanuo en foctoriolN el valoi ue multiplicai i uesue n hasta el valoi ue m-1. En
la instiuccion siguiente, multiplicamos el valoi ue foctoriolN poi el valoi ue
foctoriolH que hemos calculauo antes, ue maneia que nos ahoiiamos unas cuantas
vueltas ue bucle. Finalmente calculamos {n-m)! poi el mtouo tiauicional y
calculamos el iesultauo final uel nmeio combinatoiio. Se han omitiuo las
compiobaciones ue aigumentos paia facilitai la lectuia uel couigo.
function result = numeroCombinatorio3( n, m )
factorialM=factorial1(m);

factorialN=1;
for i=n:-1:m+1
factorialN=factorialN*i;
end
factorialN=factorialN*factorialM;

factorialNmenosM=factorial1(n-m);

result=factorialN/(factorialM*factorialNmenosM);
end
P(#)*+# Z
46 ejercicios resueltos Je HATlAB
9
J98%)*)*& VO e
x
.&% 3,A-&%
L8,-*Q,% (#, @(#)*+# R(8 %8)*S*8#'& )&0& ,%/(08#$& '8 8#$%,', (# #T08%&
%8,- = '8;(8-;, 8- ;,-&% '8 -, 8=.&#8#)*,- '8 '*)F& #T08%&< R(8 '8S8%C
),-)(-,%:8 08'*,#$8 :( :8%*8 '8 3,A-&% $%(#),', 8# n '8 $,- @&%0, R(8 8-
8%%&% ,S:&-($& 8#$%8 -, :8%*8 8# 8- $[%0*#& n-1 A n :8, 08#&% '8 N\
EX
O 4, :8%*8
'8 3,A-&% '8 -, 8=.&#8#)*,- ;*8#8 ',', .&% -, 8=.%8:*+#]
!
!
!
!
!
!!
! !!
!
!!!

Solucion 1.
Antes ue implementai la funcion es conveniente planteai un ejemplo paia vei
como pouemos aboiuai la solucion. Al piogiamai funciones ue clculo, en muchos
casos, uebemos intentai imitai nuestio piopio iazonamiento.
Supongamos que ueseamos calculai e
S
(cuyo valoi es 148,41S1S91u2S764)
meuiante la apioximacion ue Tayloi:
!
!
!
!
!
!!
!
!
!
!!
!
!
!!!
!
!
!!
!
!
!
!!
!
!
!
!!
!!
Paiaiemos cuanuo la uifeiencia entie el timino n-1 y el n sea menoi que
u.uuuuuu1.
Paia una piimeia solucion no tenuiemos en cuenta esta consiueiacion uel eiioi
absoluto, y lo que haiemos sei iteiai, poi ejemplo, 1uu veces. Es uecii:
!
!
!
!
!
!!
!
!
!
!!
!
!""
!!!
!
!
!!
!
!
!
!!
!
!
!
!!
!!!
!
!!
!!!
!
!
!""
!""!

0na foima ue implementai esta solucion es la siguiente:
function result = exponencialPorTaylor1( x )
result=0;
for n=0:1:100
result=result+(x^n)/factorial(n);
end
end
P(#)*+# N\
El iesultauo ue calculai exponenciolPorToylor1{S) es:
>> exponencialPoiTayloi1(S)

ans =

148.41S2
P*/(%, 7
Hocorio Polo 0soolo
1u
Solucion 2.
Pouemos esciibii una solucion paieciua a la anteiioi, peio utilizanuo un wbile en
lugai ue un for. Biiemos entonces que mientros n {que es lo vorioble contoJor Jel
bucle) seo menor o iquol o 100, iealice el clculo:
function result = exponencialPorTaylor2( x )
result=0;
n=0;
while (n<=100)
result=result+(x^n)/factorial(n);
n=n+1;
end
end

P(#)*+# NN
Solucion S.
Con objeto ue ii aceicnuonos a lo que nos piue el enunciauo, vamos a mouificai
ligeiamente el couigo anteiioi paia que la funcion nos muestie la uifeiencia entie
el valoi calculauo paia n y paia n-1. Ns auelante, en otia solucion, utilizaiemos
este valoi (el eiioi absoluto) como conuicion ue paiaua paia uevolvei el iesultauo
solicitauo.
En la Funcion 12 hemos aauiuo unas lineas al couigo anteiioi: ya que necesitamos
compaiai, en caua iteiacion uel bucle, el iesultauo que se acabe ue calculai con el
anteiioi, cieamos antes uel wbile una vaiiable ultimoResultoJo a la que asignamos
el valoi infinito (funcion lnf{) ue NATLAB). Luego, en caua vuelta uel bucle,
asignamos a una vaiiable error la uifeiencia entie el ltimo iesultauo calculauo
(almacenauo en la vaiiable ultimoResultoJo que hemos cieauo ex piofeso paia
esto) y el iesultauo que se acaba ue calculai. Nostiamos el error poi la consola
(Jisp{error)) y, poi ltimo, actualizamos el valoi ue ultimoResultoJo al valoi que se
acaba ue calculai.
function result = exponencialPorTaylor3( x )
result=0;
n=0;
ultimoResultado=Inf();
while (n<=24)
result=result+(x^n)/factorial(n);
error=ultimoResultado-result;
ultimoResultado=result;
disp(error);
n=n+1;
end
end

P(#)*+# NU
Si ejecutamos exponenciolPorToyloS{S), NATLAB muestia lo siguiente:
>>exponencialPoiTayloiS(S)
46 ejercicios resueltos Je HATlAB
11
Inf
-S
-12.S
-2u.8SSSSSSSSSSSS
-26.u416666666667
-26.u416666666667
-21.7u1S888888889
-1S.Suu992u6S4921
-9.68812uuS9682SS
-S.S8228891u9S47S
-2.6911444SS467S7
-1.22S2474797S79
-u.Su96864498991SS
-u.196uSS2499612u4
-u.u7uu118749861S6
-u.u2SSS7291662u4SS
-u.uu72929uS644S8S84
-u.uu214497166u1u119
-u.uuuS9S82S46114711S
-u.uuu1S679617S996SS4
-S.9199u4S4991S8Se-uS
-9.SSS1uSS9SuS298e-u6
-2.12116uS49S88S4e-u6
-4.6112182872u9S4e-u7
-9.6u67uS47SS6219e-u8
u
u
...
u

ans=
148.41S1S9u788S7

P*/(%, X
La laiga lista ue nmeios que muestia (hemos omitiuo bastantes ceios al final) se
coiiesponue con los valoies ue error calculauos en caua iteiacion uel bucle wbile.
Solucion 4.
Paia cumplii con el enunciauo, el computo uebe ueteneise en el momento en que
el valoi absoluto uel error sea menoi que 1u
-7
. Como lo vamos calculanuo en caua
vuelta uel bucle, basta con que mouifiquemos la conuicion ue paiaua uel wbile paia
que, en lugai ue uai 1uu vueltas fijas, est uanuo vueltas mientias el valoi absoluto
ue error sea mayoi o igual a 1u
-7
. Es uecii, que mouificamos el couigo paia que
queue como sigue:
Hocorio Polo 0soolo
12
function result = exponencialPorTaylor4( x )
result=0;
error=Inf();
ultimoResultado=Inf();
n=0;
while (abs(error)>=10e-7)
result=result+(x^n)/factorial(n);
error=ultimoResultado-result;
ultimoResultado=result;
n=n+1;
end
end

P(#)*+# NV

46 ejercicios resueltos Je HATlAB
1S
J98%)*)*& 6O xeno(x) .&% 3,A-&%
J:)%*S*% (#, @(#)*+# R(8 %8)*S*8#'& )&0& ,%/(08#$& '8 8#$%,', (# #T08%&
%8,- x '8;(8-;, 8- :8#& '8 '*)F& #T08%&< R(8 '8S8%C ),-)(-,%:8 08'*,#$8 :(
:8%*8 '8 3,A-&% $%(#),', 8# n '8 $,- @&%0, R(8 8- 8%%&% ,S:&-($& 8#$%8 -,
:8%*8 8# 8- $[%0*#& n-1 A n :8, 08#&% '8 N\8EXO 4, :8%*8 '8 3,A-&% '8- :8#&
;*8#8 ',', .&% -, 8=.%8:*+#]
!"#$ ! !
!!!!
!
!" !! !
!
!"!!
! !!
!
!!!

Solucion 1.
La solucion a este ejeicicio es muy paieciua a la uel anteiioi: ya que no sabemos
exactamente cuntas iteiaciones uebemos hacei, sino solo la conuicion ue paiaua,
lo haiemos, como antes, con un bucle wbile. La conuicion ue paiaua sei la misma,
y la foima ue clculo tambin muy similai. Cambiai nicamente la foimula ue
asignacion uel iesultauo.
function result = senoTaylor(x)
result=0;
error=Inf();
resultAnterior=Inf();
n=0;
while (abs(error)>=10e-7)
result=result+((-1)^n/factorial(2*n+1))*(x^(2*n+1));
error=abs(result-resultAnterior);
n=n+1;
resultAnterior=result;
end
end

P(#)*+# N6

Hocorio Polo 0soolo
14
J98%)*)*& WO P,)$&%*,- %8)(%:*;&
J:)%*S*% (#, @(#)*+# R(8 ),-)(-8 8- @,)$&%*,- '8 0,#8%, %8)(%:*;,O
Solucion 1.
0na funcion iecuisiva es una funcion que, en su implementacion, contiene una
llamaua a si misma. La funcion factoiial se uesciibe iecuisivamente ue foima muy
natuial, ya que:
n!=n{n-1)!
Es uecii, el factoiial ue n es n multiplicauo poi el factoiial ue n-1. En efecto,
S!=S4S21 o, lo que es lo mismo, S!=S4!, ya que 4!=4S21.
En las funciones uebe habei siempie, al menos, un caso base, que haga que las
sucesivas llamauas a la funcion se uetengan. En el caso uel factoiial, el caso base se
alcanza cuanuo n=0, ya que u!=1.
En la Funcion 1S pieguntamos que si el aigumento que se est pasanuo es u: en
caso afiimativo, asignamos a result el valoi 1 y la llamaua a la funcion teimina; en
caso negativo, asignamos a result el iesultauo ue multiplicai n poi el factoiial ue n-
1, tal y como haciamos aiiiba al esciibii n!=n{n-1)!
function result = factorialRecursivo( n )
if (n==0)
result=1;
return
else
result=n*factorialRecursivo(n-1);
return
end
end


P(#)*+# NW
Supongamos que ueseamos calculai iecuisivamente el factoiial ue S. La siguiente
tabla muestia una tiaza ue lo que va suceuienuo al esciibii en la linea ue comanuo
ue NATLAB foctoriolRecursivo{S):
D&08#$,%*&: # %8:(-$
1" llamaua a la funcion. Se
ejecuta foctoriolRecursivo{S)
S
Como n no es u, se entia al else S iesult=S*factoiialRecuisivo(4)
2" llamaua. Se ejecuta
foctoriolRecursivo{4). n toma
ahoia el valoi 4
4
Como n no es u, se entia al else 4 iesult=4* factoiialRecuisivo(S)
S" llamaua. Se ejecuta
foctoriolRecursivo{S). n entia
valienuo S
S
46 ejercicios resueltos Je HATlAB
1S
D&08#$,%*&: # %8:(-$
Como n no es u, se entia al else S iesult=S* factoiialRecuisivo(2)
4" llamaua. Se ejecuta
foctoriolRecursivo{2). El valoi ue
n es 2
2
Como n no es u, se entia al else 2 iesult=2*factoiialRecuisivo(1)
S" llamaua. Se ejecuta
foctoriolRecursivo{1). n llega
valienuo 1
1
Como n no es u, se entia al else 1 iesult=1*factoiialRecuisivo(u)
6" llamaua. Se ejecuta
foctoriolRecursivo{0). n vale u
u
n es ahoia u, poi lo que es cieita
la conuicion uel if {n==0)
u iesult=1
Fn este punto se bo olconzoJo el coso bose, por lo que no boy ms llomoJos
recursivos. Aboro, el volor colculoJo en lo 6 llomoJo se utilizo poro colculor el volor
Je lo S llomoJo, que o su vez se utilizo poro colculor el Je lo 4, etctero.
Regieso a la S" llamaua. 1 iesult=1*factoiialRecuisivo(u)=1*1=1
Regieso a la 4" llamaua. 2 iesult=2*factoiialRecuisivo(1)=1*2=1
Regieso a la S" llamaua. S iesult=S*factoiialRecuisivo(2)=S*2=6
Regieso a la 2" llamaua. 4 iesult=4*factoiialRecuisivo(S)=4*6=24
Regieso a la 1" llamaua. S iesult=S*factoiialRecuisivo(S)=S*24=12u
3,S-, U

Hocorio Polo 0soolo
16
J98%)*)*& 7O Flbonuccl
J:)%*S*% (#, @(#)*+# R(8 ),-)(-8 8- $[%0*#& n '8 -, @(#)*+# '8 P*S&#,))*< R(8
;*8#8 ',', .&%] =N^N_ =U ^ N_ =*^=*EN`=*EU
Solucion 1.
Puesto que ya sabemos un poco ue iecuisiviuau, es fcil obseivai que la funcion ue
Fibonacci se uesciibe muy bien ue foima iecuisiva:
fibonocci{1)=1
fibonocci{2)=1
fibonocci{n)=fibonocci{n-1) - fibonocci{n-2), si n~2
0bseivamos que hay uos casos base: uno con n=0 y otio con n=1. En estos uos
casos, el valoi ue la funcion es 1. El couigo pueue sei el siguiente:
function result=fib(n)
if (n==1)
result=1;
elseif (n==2)
result=1;
else
result=fib(n-1)+fib(n-2);
end
end

P(#)*+# N7O P*S&#,))* %8)(%:*;& )&# '&: ),:&: S,:8
Solucion 2.
0bsivense en el couigo anteiioi los uos casos base, maicauos en amaiillo.
Realmente, pouemos agiupailos en uno solo:
function result=fib2(n)
if (n<=2)
result=1;
else
result=fib(n-1)+fib(n-2);
end
end

P(#)*+# NXO P*S&#,))* %8)(%:*;& )&# (# ),:& S,:8
Solucion S.
Cualquieia ue las uos soluciones que hemos uauo aiiiba es muy costosa en
timinos uel nmeio ue sumas que es necesaiio iealizai. Paia calculai a mano, poi
ejemplo, fib{8), hacemos lo siguiente:
fib{8)=fib{7)-fib{6)=
46 ejercicios resueltos Je HATlAB
17
= [fib{6)-fib{S)] - [fib{S)-fib{4)] =
= { [fib{S)-fib{4)] - [fib{4)-fib{S)] ] - { [fib{4)-fib{S)] - [fib{2)-fib{1)] ] = .
El mismo computo, que iesulta complicauo esciibiilo en foima ue ecuacion, se
pueue iepiesentai ue foima aiboiescente: notese que hay clculos que se iepiten
vaiias veces, y obsivese que el caso base se alcanza en total 21 veces,
coiiesponuientes a los 21 unos que hay en el ibol, y que fibonocci{8)=21.

P*/(%, YO a%S&- )&%%8:.&#'*8#$8 ,- )C-)(-& $%,'*)*&#,- '8 Flbonuccl(8)
Poi ello, es conveniente utilizai, si es posible, algoiitmos ms ipiuos. 0na veision
menos compleja computacionalmente hablanuo, y que auems no utiliza
iecuisiviuau, es la siguiente:
function result=fib3(n)
i=1;
j=0;
for k=1:1:n
t=i+j;
i=j;
j=t;
end
result=j;
end

P(#)*+# NYO b8%:*+# *$8%,$*;, '8 -, @(#)*+# '8 Flbonuccl
Solucion 4.
Pouemos compaiai el tiempo ueuicauo poi el oiuenauoi a iealizai un ueteiminauo
computo meuiante las funciones ue NATLAB tic (que pone el cionometio a ceio) y
toc (que lo uetiene). En la siguiente figuia iepiouucimos el couigo ue la Funcion 17
y ue la Funcion 18, peio con las instiucciones tic y toc.
Hocorio Polo 0soolo
18
function result=fib2(n)
tic;
if (n<=2)
result=1;
else
result=fib2(n-1)+fib2(n-2);
end
toc;
end

function result=fib3(n)
tic;

i=1;
j=0;
for k=1:1:n
t=i+j;
i=j;
j=t;
end
result=j;
toc;
end

P(#)*+# NZO 4, ;8%:*+# %8)(%:*;, c*QR(*8%',d A -, *$8%,$*;, c'8%8)F,d .,%, ),-)(-,% P*S&#,))*< ,#&$,',:
)&# *#:$%())*&#8: .,%, ),-)(-,% 8- $*80.&
El iesultauo ue ambas funciones paia calculai fibonocci{20) es:
>> fib2(2u)
Elapseu time is u.uuu119 seconus.

ans =

676S
>> fibS(2u)
Elapseu time is u.uuuuuS seconus.

ans =

676S
Solucion S.
Si investigamos un poquito, aveiiguaiemos que el timino n ue la funcion
Fibonacci se coiiesponue tambin con el siguiente valoi:
!"# ! !
!
!
!!! !!!
!
!

.en uonue:
! !
! ! !
!

Asi, otia implementacion ue la funcion, mucho ms ipiua que cualquieia ue las
anteiioies, ya que no iequieie ni iecuisiviuau ni bucles, es la uaua en la Funcion
2u: piimeio se calcula el valoi ue m, y luego calculamos y uevolvemos el iesultauo.
function result=fib4(n)
fi=(1+sqrt(5))/2;

result=(fi^n-(1-fi)^n)/sqrt(5);
end

P(#)*+# U\

46 ejercicios resueltos Je HATlAB
19
J98%)*)*& XO 4, '*;*#, .%&.&%)*+#
B8 .*'8 %8,-*Q,% (#, @(#)*+# R(8 %8)*S*8#'& )&0& ,%/(08#$& '8 8#$%,', (#
#T08%& 8#$8%& .&:*$*;& n '8;(8-;, 8- ;,-&% '8 -, ,.%&=*0,)*+# '8 -, Jlvlnu
proporcln .,%, 8- $[%0*#& n '8 -, :8%*8 '8 P*S&#,))*O
4, Jlvlnu proporcln 8: -, '*;*:*+# '8- $[%0*#& l '8 -, :8%*8 '8 P*S&#,))* 8#$%8
8- ,#$8%*&%O
Solucion 1.
Babienuo ya implementauo la funcion ue Iibonocci, la iesolucion ue este ejeicicio
es muy sencilla. La foimula ue clculo es:
JivinoProporcin{n)=fibonocci{n),fibonocci{n-1)
Pouemos hacei uso ue cualquieia las implementaciones que hemos uauo a la
funcion ue Iibonocci en el ejeicicio anteiioi, no sienuo necesaiio ieesciibiila:
function result = divinaProporcion( n )
result=fib4(n)/fib4(n-1);
end

P(#)*+# UN

Hocorio Polo 0soolo
2u
J98%)*)*& YO D&#;8%:*+# '8 8#$8%& , S*#,%*&
J:)%*S*% (#, @(#)*+# '8 123425 R(8< %8)*S*8#'& )&0& ,%/(08#$& '8
8#$%,', (# #T08%& 8#$8%&< n< %8.%8:8#$8 .&% .,#$,--, :( 8R(*;,-8#$8 8# 8-
:*:$80, S*#,%*&O B* 8- #T08%& 8: #8/,$*;&< :8 '8S8%C 8:)%*S*% 8-
)&%%8:.&#'*8#$8 :*/#& 08#&: ,#$8: '8- #T08%&O B* 8- #T08%& #& 8: 8#$8%&< :8
0&:$%,%C (# 08#:,98 '8 8%%&%O
Solucion 1.
Antes ue piogiamai, veamos como hacemos a mano una conveision ue enteio a
binaiio. Supongamos que queiemos pasai a binaiio el nmeio 1S: lo que hacemos
es ii uiviuienuo sucesivamente entie 2 hasta que el cociente obteniuo sea 1. Luego,
paia constiuii la iepiesentacion en base 2, iecoiiemos uesue el ltimo cociente
obteniuo (1), y subienuo poi touos los iestos:

Be este mouo, obtenemos que 1S2=1111.
Be igual maneia pouemos calculai el 29 en base 2:

Asi, 292=111u1.
Poi tanto, utilizaiemos un bucle paia ii uiviuienuo el nmeio que obtengamos
entie 2, mientias que el cociente sea mayoi o igual a 2. Auems, uebeiemos ii
memoiizanuo los iestos que vayamos obtenienuo.
0na piimeia apioximacion a la solucion es la siguiente (Funcion 22):
46 ejercicios resueltos Je HATlAB
21
function result = pasarABinario( n )
cociente=n;
resto=mod(cociente, 2);

result=[resto];

while (cociente>=2)
cociente=floor(cociente/2);
resto=mod(cociente, 2);
result=[resto result];
end
end

P(#)*+# UUO >%*08%, ,.%&=*0,)*+# .,%, -, )&#;8%:*+# , S*#,%*&
El couigo ue la Funcion 22 tiene una noveuau iespecto ue las funciones que hemos
esciito hasta ahoia: a la vaiiable result le asignamos, en las lineas iesaltauas,
valoies entie coichetes. Con los coichetes inuicamos que la vaiiable es un vectoi.
En la piimeia sentencia (result=[resto]), guaiuamos en result un vectoi con un solo
elemento, el iesto que se ha calculauo. En la segunua (result=[resto result])
aauimos al comienzo uel vectoi result el valoi que hemos calculauo uel resto en
esta iteiacion.
0samos, auems, la funcion moJ en la piimeia asignacion al iesto:
resto=moJ{cociente, 2). moJ{x,y) uevuelve el iesto ue la uivision enteia ue x entie y.
Igualmente, usamos la funcion floor, que ieuonuea un nmeio uecimal al enteio
inmeuiatamente infeiioi.
Bagamos una tiaza ue la funcion con n=12:
D&08#$,%*&: # )&)*8#$8 %8:$& %8:(-$
Llamaua a la funcion 12
Ejecucion ue cociente=n 12 12
Ejecucion ue resto=moJ{cociente, 2) 12 12 u
Ejecucion ue result=[resto] 12 12 u | u j
Entiamos al bucle, ya que
cociente~=2
12 12 u | u j
cociente=floor{cociente,2) 12 6 u | u j
resto=moJ{cociente, 2) 12 6 u | u j
result=[resto result] 12 6 u | u u j
Segunua vuelta al bucle 12 6 u | u uj
cociente=floor{cociente,2) 12 S u | u j
resto=moJ{cociente, 2) 12 S 1 | u j
result=[resto result] 12 S 1 | 1 u u j
Teiceia vuelta al bucle 12 S 1 | 1 u u j
cociente=floor{cociente,2) 12 1 1 | u j
resto=moJ{cociente, 2) 12 1 1 | u j
result=[resto result] 12 1 1 | 1 1 u u j
Y en este momento se sole Jel bucle, yo que cociente=1, que es menor que 2
3,S-, VO 3%,Q, '8 puxurABlnurlo(12)
Hocorio Polo 0soolo
22
Si en la consola ue NATLAB ejecutamos posorABinorio{12), se nos muestia lo
siguiente:
>> pasaiABinaiio(12)

ans =

1 1 u u
P*/(%, Z
El iesultauo que nos est uevolvienuo NATLAB no es un nmeio enteio ni natuial,
sino un vectoi con cuatio valoies.
Solucion 2.
En el enunciauo uel pioblema se nos uice que "Si el nmeio es negativo, se uebei
esciibii el coiiesponuiente signo menos antes uel nmeio".
Como sabemos, el piimei uigito uel nmeio binaiio es el piimei iesto que
calculamos. Lo que haiemos sei pieguntai, uespus uel bucle, si el nmeio que
nos pasaion como paimetio es negativo: en caso afiimativo, mouificaiemos el
piimei elemento uel vectoi multiplicnuolo poi -1; en caso negativo, lo uejamos
como est. Inicialmente, pouiiamos uejai esto ue la siguiente maneia:
function result = pasarABinario2( n )
cociente=n;
resto=mod(cociente, 2);

result=[resto];

while (cociente>=2)
cociente=floor(cociente/2);
resto=mod(cociente, 2);
result=[resto result];
end
if (n<0)
result(1)=-1*result(1);
end
end


P(#)*+# UVO 4, @(#)*+# '8 .,:& , S*#,%*& )&# :&.&%$8 .,%, #8/,$*;&:< .8%& )&# (# .8R(8e& 8%%&%
En las lineas en amaiillo pieguntamos que, si n<0, entonces el piimei elemento uel
vectoi sea sustituiuo poi su valoi multiplicauo poi -1. Al ejecutai, como ejemplo,
posorABinorio{-12), espeiaiiamos la iespuesta -11uu; sin embaigo, NATLAB nos
iesponue, soipienuentemente, ue la siguiente foima:
46 ejercicios resueltos Je HATlAB
2S
>> pasaiABinaiio2(-12)

ans =

u
P*/(%, N\
El eiioi lo encontiamos en la piimeia sentencia ue la funcion, que necesita sei
mouificaua: si n=-12, entonces poi la asignacion que hay a continuacion se hace
cociente=-12 y no se entia en el wbile, ya que no se veiifica la conuicion. Bebemos
asignai, en la piimeia instiuccion, el valoi obs{n) a cociente. Es uecii:

function result = pasarABinario2( n )
cociente=abs(n);
resto=mod(cociente, 2);

result=[resto];

while (cociente>=2)
cociente=floor(cociente/2);
resto=mod(cociente, 2);
result=[resto result];
end
if (n<0)
result(1)=-1*result(1);
end
end



P*/(%, NNO 4, @(#)*+# '8 .,:& , S*#,%*& )&# :&.&%$8 .,%, #8/,$*;&:< ,F&%, )&%%8/*',
Solucion S.
En el enunciauo tambin se nos uice que, si el nmeio que se pasa como paimetio
no es enteio, se uebe uai un mensaje ue eiioi. 0na foima ue compiobai esto es
pieguntai si el paimetio n es igual a la paite enteia uel piopio n, es uecii:
Hocorio Polo 0soolo
24
function result = pasarABinario3( n )
if (n~=floor(n))
error('Se esperaba un entero');
return;
end

cociente=abs(n);
resto=mod(cociente, 2);

result=[resto];

while (cociente>=2)
cociente=floor(cociente/2);
resto=mod(cociente, 2);
result=[resto result];
end
if (n<0)
result(1)=-1*result(1);
end
end

P(#)*+# U6

46 ejercicios resueltos Je HATlAB
2S
J98%)*)*& ZO D&#$,'&% '8 ,.,%*)*&#8:
J:)%*S*% (#, @(#)*+# '8 123425 R(8 $&08 )&0& 8#$%,',: (# ;8)$&% '8
#T08%&: 8#$8%&: v A (# #T08%& 8#$8%& n< A R(8 '8;(8-;, 8- #T08%& '8 ;8)8:
R(8 n 8:$C )&#$8#*'& 8# 8- ;8)$&% vO
Solucion 1.
Igual que en otias ocasiones, veamos como haiiamos esto a mano. Supongamos
que tenemos el vectoi v= {1 2 1 S 4 1 2 S 6 4 1], y que
ueseamos contai las apaiiciones ue n=1.
>&:*)*+# N U V 6 W 7 X Y Z N\ NN
b,-&% 1 2 1 S 4 1 2 S 6 4 1

A mano, leeiiamos el valoi ue la posicion 1; como es 1, almacenamos 1 en un
contauoi; pasamos a la posicion 2 y, como no es 1, uejamos el contauoi como est;
pasamos a la posicion S y, como contiene un 1, inciementamos en uno el contauoi,
que ya vale 2; llegamos sin cambiai hasta la posicion 6, en la que hacemos que
contauoi sea S, y seguimos hasta el final uel vectoi, la posicion 11, en la que
inciementamos el contauoi hasta 4.
0na implementacion ue esta solucion es la siguiente (Funcion 2S): utilizamos como
contauoi la vaiiable result; luego iecoiiemos touas las posiciones uel vectoi con
un bucle for que va uesue 1 hasta su longituu (lenqtb{vector)). En el cueipo uel
bucle tomamos en la vaiiable vi el valoi i-simo uel vectoi, lo compaiamos con n y,
si es igual, inciementamos el iesultauo.
function result = problema8ContadorB( vector, n )
result=0;

for i=1:1:length(vector)
vi=vector(i);
if (vector(i)==n);
result=result+1;
end
end
end

P(#)*+# UWO ?#, .%*08%, ;8%:*+# '8 -, @(#)*+# .,%, )&#$,% 8- #T08%& '8 ,.,%*)*&#8:
Paia ejecutai la funcion con el vectoi uauo como ejemplo y paia que busque el
valoi 1, esciibimos en el iea ue comanuos ue NATLAB uos instiucciones: piimeio,
una paia asignai a una vaiiable x el vectoi; luego, la llamaua a la funcion que
hemos esciito.
Hocorio Polo 0soolo
26
>> x=| 1 2 1 S 4 1 2 S 6 4 1j

x =

1 2 1 S 4 1 2 S 6 4 1

>> pioblema8ContauoiB(x, 1)

ans =

4
P*/(%, NU
Solucion 2.
NATLAB uispone ue muchas funciones muy comouas paia tiabajai con vectoies y
matiices. Bauo el vectoi anteiioi, pouemos esciibii en la linea ue comanuos lo
siguiente:
>> x==2

ans =

u 1 u u u u 1 u u u u
P*/(%, NV
Lo que le estamos uicienuo a NATLAB con x==2 es que me muestie qu valoies uel
vectoi x son iguales a 2 y cules no. Como iespuesta, NATLAB uevuelve otio vectoi
con unos y ceios: en aquellas posiciones en las que el vectoi tiene valoi 2, NATLAB
pone un 1, y un u en las que no. Be este mouo, apaiece el valoi 1 en las posiciones
2 y 7, ya que x contiene un 2 en esas uos posiciones.
>&:*)*+# N U V 6 W 7 X Y Z N\ NN
=^ 1 2 1 S 4 1 2 S 6 4 1
f=^^Ug u 1 u u u u 1 u u u u

0tia funcion inteiesante ue NATLAB es la funcion sum: aplicaua a un vectoi,
uevuelve la suma ue sus elementos. Poi ejemplo, la suma ue los valoies ue x es Su:
>> sum(x)

ans =

Su
P*/(%, N6
Bien, pues pouemos combinai ambas funciones paia calculai muy ipiua y
sencillamente el nmeio ue apaiiciones ue un elemento en un vectoi: si
calculamos la suma uel vectoi ue unos y ceios, ya sabiemos cuntas veces apaiece
el nmeio solicitauo:
46 ejercicios resueltos Je HATlAB
27
function result = problema8ContadorA( vector, n )
result=sum(vector==n);
end

P(#)*+# U7O M$%, ;8%:*+#< 0()F& 0C: 8@*),Q
En efecto, lo que uecimos en la sentencia ue asignacion ue la Funcion 26 es que
asigne a result el iesultauo ue sumai los elementos uel vectoi ue unos y ceios
constiuiuo a paitii ue la compaiacion uel vector pasauo como paimetio con el
valoi ue n.
>&:*)*+# N U V 6 W 7 X Y Z N\ NN
=^ 1 2 1 S 4 1 2 S 6 4 1
f=^^Ug u 1 u u u u 1 u u u u
lo sumo Je los elementos en omorillo es 2.

Y si, funciona:
>> pioblema8ContauoiA(x, 2)

ans =

2
P*/(%, NW

Hocorio Polo 0soolo
28
J98%)*)*& N\O >%&'()$& 8:),-,%
J:)%*S*% (#, @(#)*+# R(8 ),-)(-8 8- .%&'()$& 8:),-,% '8 '&: ;8)$&%8: v A w
R(8 :8 .,:,# )&0& .,%C08$%&:O B* #& :8 %8)*S*8:8# '&: ,%/(08#$&: '8
8#$%,', :8 '8S8%C 0&:$%,% (# 08#:,98 '8 8%%&% .&% .,#$,--, A '8;&-;8% (# ENO
B* -,: '*08#:*&#8: '8 -&: ;8)$&%8: @(8%,# *#)&F8%8#$8: .,%, %8,-*Q,% 8-
.%&'()$& 8:),-,% :8 '8S8%C '8;&-;8% (# EN A 0&:$%,% $,0S*[# (# 08#:,98 '8
8%%&%O
Solucion 1.
El piouucto escalai ue uos vectoies se calcula ue la siguiente foima:
! ! ! ! !!! !!! !!" !
!!
!!
!
!"
! !! ! !! !!! ! !! !!!!" ! !"
Si lo calculamos a mano, consiste en ii acumulanuo la suma ue multiplicai el
piimeio poi el piimeio, ms el segunuo poi el segunuo, ms el teiceio poi el
teiceio, etcteia.
Paia esciibii la funcion NATLAB coiiesponuiente, basta con un bucle for que
iecoiia uesue 1 hasta n (uonue n es la longituu ue los vectoies) y que acumule en
una vaiiable la suma ue los piouuctos. Es uecii:
function result = productoEscalar(v, w)
result=0;
for i=1:1:length(v)
result=result+v(i)*w(i);
end
end

P(#)*+# UXO P(#)*+# .,%, 8- )C-)(-& '8- .%&'()$& 8:),-,%
Solucion 2.
En el enunciauo nos piuen que hagamos vaiias compiobaciones ue aigumentos:
que haya 2 y que las uimensiones ue ambos vectoies sean coheientes. En el piimei
if uel siguiente couigo compiobamos que se pasan exactamente uos aigumentos;
en el segunuo, que las longituues ue ambos vectoies sean iguales.
46 ejercicios resueltos Je HATlAB
29
function result = productoEscalar2(v, w)
if (nargin~=2)
disp('Debe pasar dos argumentos');
return;
end
if (length(v)~=length(w))
disp('Los vectores deben tener el mismo nmero de elementos');
return;
end

result=0;
for i=1:1:length(v)
result=result+v(i)*w(i);
end
end
P(#)*+# UYO >%&'()$& 8:),-,% )&# )&0.%&S,)*+# '8 ,%/(08#$&:
Solucion S.
Besue luego, pouemos utilizai tambin los piopios opeiauoies ue NATLAB paia
multiplicai matiices y vectoies y hacei la cosa mucho ms sencilla.
En la siguiente figuia mostiamos el uso uel opeiauoi * paia multiplicai uos
vectoies:
! En (1), mostiamos el valoi uel vectoi x.
! En (2), asignamos a y el mismo vectoi x, ue maneia que ya tenemos uos
vectoies.
! En (S), utilizamos el opeiauoi ' paia peuiile a NATLAB que nos muestie el
vectoi y tiaspuesto.
! En (4), intentamos multiplicai x poi y. NATLAB ua un eiioi poique los
vectoies ueben tenei uimensiones compatibles: 1xn y nx1.
! En (S) aiieglamos el pioblema, multiplicanuo x poi el tiaspuesto ue y.
>> x

x =

1 2 1 S 4 1 2 S 6 4 1
>> y=x

y =

1 2 1 S 4 1 2 S 6 4 1
>> y'

ans =

1
2
1
S
4
1
2
S
6
4
1
>> x*y
... Eiioi using ==> mtimes
Innei matiix uimensions must agiee.
>> x*y'

ans =

114
P*/(%, N7O DC-)(-& '8- .%&'()$& 8:),-,%< '*%8)$,08#$8 8# -, -h#8, '8 )&0,#'&: '8 123425
1
2
S
4
S
Hocorio Polo 0soolo
Su
En iealiuau, no nos hace falta entonces cieai ninguna funcion en NATLAB paia
calculai el piouucto escalai ue uos vectoies. No obstante, si ueseamos haceilo:
function result = productoEscalar3(v, w)
if (nargin~=2)
disp('Debe pasar dos argumentos');
return;
end
if (length(v)~=length(w))
disp('Los vectores deben tener el mismo nmero de elementos');
return;
end

result=v*w';
end

P(#)*+# UZ


46 ejercicios resueltos Je HATlAB
S1
J98%)*)*& NNO P*S&#,))* 8# (# ;8)$&%
J:)%*S*% (#, @(#)*+# '8 123425 R(8 )&#:$%(A, (# ;8)$&% R(8 )&#$8#/, -&: n
.%*08%&: $[%0*#&: '8 -, :8%*8 '8 P*S&#,))*< '&#'8 n 8: (# .,%C08$%& R(8 :8
.,:,%C )&0& ,%/(08#$& '8 8#$%,',O
Solucion 1.
En la Funcion Su uamos una piimeia solucion: piimeio asignamos a fib (la vaiiable
que, en este caso y poi vaiiai, utilizamos paia uevolvei el iesultauo) un vectoi ue
tantos ceios como valoi tenga el paimetio n. Paia ello usamos la funcion zeros{x)
ue NATLAB, que constiuye un vectoi con x ceios.
Luego, colocamos senuos unos en la piimeia y segunua posiciones. A continuacion,
iecoiiemos el vectoi uesue la posicion S hasta el final, colocanuo en caua una la
suma ue las uos posiciones anteiioies.
function fib=vectorFibonacci(n)
fib=zeros(1, n)
fib(1) = 1;
fib(2) = 1;

for i = 3 : n
fib(i) = fib(i-1) + fib(i-2);
end
end

P(#)*+# V\
El iesultauo es el siguiente:
>> vectoiFibonacci(8)

ans =

1 1 2 S S 8 1S 21
P*/(%, NX
Solucion 2.
Tambin pouemos utilizai cualquieia ue las funciones paia el clculo ue la funcion
ue Fibonacci que vimos en ejeicicios anteiioies. Poi ejemplo:
function fib=vectorFibonacci2(n)
fib=[];
for i = 1 : n
fib=[fib fib2(i)];
end
end
P(#)*+# VN
En el couigo anteiioi hay uos noveuaues: la piimeia en la sentencia fib=[], que
constiuye un vectoi vacio; la segunua en el bucle for, que tiene solamente los
Hocorio Polo 0soolo
S2
valoies inicial y final ue i, y no el inciemento que uebe uaise a esta vaiiable en
caua vuelta uel bucle. Cuanuo el inciemento no se pone, NATLAB asume que es 1.

46 ejercicios resueltos Je HATlAB
SS
J98%)*)*& NUO I*:$,#)*, ,- .%*08%&
J:)%*S, (#, @(#)*+# '8 123425 R(8 %8)*S, (# ;8)$&% '8 #T08%&: %8,-8:< v<
)&0& ,%/(08#$& '8 8#$%,', A '8$8%0*#8 )(C- '8 $&'&: 8--&: 8: 8- 0C:
)8%),#& ,- .%*08%& '8 -&: 8-808#$&: '8- ;8)$&% A '8;(8-;, :( .&:*)*+#< p<
'8#$%& '8- ;8)$&%O
J980.-&] .,%, v = (2, 6, 4, 1, 10) < p = 4< A, R(8 8- #T08%& 0C: )8%),#& ,-
.%*08%& cUd 8: 8- )(,%$& cNdO
B* #& :8 .%&.&%)*&#, (# ;8)$&% '8 8#$%,', :8 /8#8%,%C (# ;8)$&% '8
$,0,e& N\ '8 #T08%&: ,-8,$&%*&: %8,-8: 8#$%8 \ A N\O J# ),:& '8 R(8 8-
;8)$&% #& $8#/, ,- 08#&: '&: )&0.&#8#$8:< 8- 0[$&'& '8;&-;8%C (# ENO
Solucion 1.
Piimeio ue touo, como lo haiiamos a mano. Supongamos que tenemos el vectoi
que nos pioponen en el enunciauo:
>&:*)*+# N U V 6 W
;^ 2 6 4 1 1u
En un pioceuimiento manual, piobablemente leeiiamos y memoiizaiiamos el
piimei nmeio; luego, leeiiamos el segunuo, calculaiiamos la uifeiencia (en valoi
absoluto, poi si hubieia negativos) y, puesto que ue momento es el ms ceicano (la
uifeiencia es 4), guaiuaiiamos su posicion (2) como iesultauo. A continuacion
leeiiamos el teiceio (un 4), calculaiiamos la uifeiencia iespecto uel piimeio (4-
2=2) y, como es menoi que el iesultauo que llevamos hasta el momento (4),
almacenamos la posicion (S) y actualizamos el iesultauo. Seguiiiamos asi hasta la
ltima posicion uel vectoi.
Bien, pues esto es exactamente lo que hacemos en la Funcion S2: en p
uevolveiemos el iesultauo, que inicializamos a -1. En mejorBistoncio guaiuamos la
uistancia o uifeiencia ms coita hasta el momento, que inicializamos a infinito.
Luego, en el bucle, iecoiiemos el vectoi uesue la segunua posicion hasta el final. En
caua iteiacion calculamos la Jistoncio uesue el elemento en el que estamos (v{i))
hasta el piimeio (v{1)). Si es menoi que la mejorBistoncio hasta el momento,
actualizamos p (con la posicion ue este elemento) y el valoi ue mejorBistoncio.
function p = distanciaAlPrimero(v)
p=-1;
mejorDistancia=Inf();

for i=2:length(v)
distancia=abs(v(i)-v(1));
if (distancia<mejorDistancia)
p=i;
mejorDistancia=distancia;
end
end
end

P(#)*+# VU
Hocorio Polo 0soolo
S4
Con el vectoi ue ejemplo, el iesultauo es:

>> x=|2 6 4 1 1uj

x =

2 6 4 1 1u

>> uistanciaAlPiimeio(x)

ans =

4
P*/(%, NY
Solucion 2.
El enunciauo nos piue que, si no se piopoiciona un vectoi ue entiaua, se geneie
uno con 1u nmeios aleatoiios ieales entie u y 1u. Si se pasa un vectoi como
entiaua peio no tiene al menos uos elementos, uebe uevolveise un -1.
La segunua compiobacion es sencilla, pues basta utilizai la funcion lenqtb{v). Paia
la segunua contaiemos el nmeio ue aigumentos con norqin: si es u, geneiaiemos
un vectoi ue 1u nmeios aleatoiios entie u y 1u.
NATLAB uispone ue la funcion ronJ, que geneia un nmeio al azai entie u y 1:
>> ianu

ans =

u.4SS1194978791S2
>> ianu

ans =

u.u1748SSS9S2S42S
>> ianu

ans =

u.4467u987S6S9S82
>> ianu

ans =

u.9182971S71S8448
P*/(%, NZ
Si ueseamos geneiai un nmeio al azai entie u y 1u, basta con esciibii ronJ*10.
Poi otio lauo, si queiemos geneiai una matiiz ue nxm nmeios aleatoiios,
esciibiiiamos ronJ{n, m). Poi ejemplo, a continuacion geneiamos una matiiz ue
4xS:
46 ejercicios resueltos Je HATlAB
SS
>> ianu(4,S)

ans =

u.88762u611199764 u.S618u1676u198u8 u.6747S814uSSS27S
u.17S67S986S92S8 u.1u7S617949848S6 u.S7SS264924622SS
u.S797917S4484912 u.446u8S8S6222SS4 u.Su28S6S9962261
u.4uS999SSu4S4979 u.991799SSS29122 u.67S26S764196uu7
P*/(%, U\
Si lo que queiemos es geneiai un vectoi ue 1u nmeios, el comanuo es ronJ{1, 10),
que es el que usaiemos en la nueva veision ue nuestia funcion: en amaiillo
inuicamos que, si el nmeio ue aigumentos es u, entonces v (el vectoi sobie el que
vamos a tiabajai) uebe inicializaise como nos piuen en el enunciauo. En el
segunuo if pieguntamos poi la longituu uel vectoi, que tambin se nos peuia.
function p = distanciaAlPrimero(v)
if (nargin==0)
v=rand(1,10)*10;
end

if (length(v)<=2)
p=-1;
return;
end

p=-1;
mejorDistancia=Inf();

for i=2:length(v)
distancia=abs(v(i)-v(1));
if (distancia<mejorDistancia)
p=i;
mejorDistancia=distancia;
end
end
end

P(#)*+# VV
Solucion S.
0na solucion ms elegante pasa poi utilizai las funciones ue NATLAB paia
manipulacion ue vectoies y matiices. Supongamos que uisponemos uel siguiente
vectoi, en el que hay algunos elementos iepetiuos:
.&:*)*+# N U V 6 W 7 X Y Z N\
=^ 1 2 S 1 4 8 -1 6 7 1
Si esciibimos x en la consola ue NATLAB, sabemos que nos muestia los elementos
uel vectoi. Si esciibimos (poi ejemplo) x-S, NATLAB nos muestia como iesultauo
un vectoi en el que ha iestauo S a touos los elementos uel vectoi oiiginal, x. Es
uecii:
Hocorio Polo 0soolo
S6
>> x-S

ans =

-4 -S -2 -4 -1 S -6 1 2 -4
P*/(%, UN
Paia iinos apioximanuo a la solucion uel ejeicicio, pouemos peuiile a NATLAB que
nos muestie el iesultauo ue iestai a touos los elementos ue x el piimei elemento
uel vectoi:
>> x-x(1)

ans =

u 1 2 u S 7 -2 S 6 u
P*/(%, UU
0, mejoi an, su valoi absoluto:
>> abs(x-x(1))

ans =

u 1 2 u S 7 2 S 6 u
P*/(%, UV
A paitii uel iesultauo mostiauo en la figuia anteiioi, sabemos que el valoi ue la
posicion que uebe uevolveinos la funcion que buscamos es un 4, que es la
ubicacion uel segunuo ceio: el que est en la piimeia posicion no nos inteiesa,
poique es el elemento con el que hacemos touas las compaiaciones.
Nos inteiesa, entonces, tiabajai con el vectoi x, peio quitnuole el piimei
elemento. Afoitunauamente, NATLAB peimite extiaei comouamente un tiozo ue
un vectoi: en la Figuia 24, le uecimos a NATLAB que vaya al vectoi x, que se fije en
su fila 1 (la nica que tiene, pues se tiata ue un vectoi y no ue una matiiz) y que, ue
ella extiaiga los elementos que hay uesue la posicion 2 hasta la ltima (lenqtb{x)):
>> x(1, 2:length(x))

ans =

2 S 1 4 8 -1 6 7 1
P*/(%, U6
Ahoia pouemos meuiile a NATLAB que, al vectoi obteniuo en la Figuia 24, le ieste
el valoi que tenemos en la posicion 1 uel vectoi x:
46 ejercicios resueltos Je HATlAB
S7
>> x(1, 2:length(x))-x(1)

ans =

1 2 u S 7 -2 S 6 u
P*/(%, UW
El elemento que buscamos es el que est en la teiceia posicion ue este vectoi
iesultante, que es iealmente el cuaito uel vectoi oiiginal. Tenuiemos esto en
cuenta paia ms auelante.
0tia funcion inteiesante ue NATLAB es min{v), que uevuelve el valoi minimo uel
vectoi que se pasa como paimetio:
>> x

x =

1 2 S 1 4 8 -1 6 7 1

>> min(x)

ans =

-1
P*/(%, U7
Realmente, nos inteiesa conocei el valoi minimo uel vectoi que constiuimos en la
Figuia 2S, en el que no estbamos consiueianuo el piimei elemento:
>> x(1, 2:length(x))-x(1)

ans =

1 2 u S 7 -2 S 6 u

>> min(x(1, 2:length(x))-x(1))

ans =

-2
P*/(%, UX
Si seleccionamos el menoi valoi, escogeiiamos el -2, que est en la sexta posicion
uel vectoi (sptima en el vectoi oiiginal). Esta eleccion seiia eiionea, pues el valoi
ms pioximo al piimeio es el u. Nouifiquemos la expiesion ue la Figuia 27 paia
que consiueie el valoi absoluto:
Hocorio Polo 0soolo
S8
>> min(abs(x(1, 2:length(x))-x(1)))

ans =

u
P*/(%, UY
Ahoia si, en la figuia anteiioi tenemos localizauo el menoi valoi uel vectoi que
pioceue ue calculai el valoi absoluto ue iestai a los elementos 2 a ltimo ue x el
valoi x{1).
El vectoi oiiginal, x, eia este:
.&:*)*+# N U V 6 W 7 X Y Z N\
=^ 1 2 S 1 4 8 -1 6 7 1

Las tiansfoimaciones que hemos iuo hacienuo paia auaptailo a nuestias
necesiuaues han siuo:
.&:*)*+# i N U V 6 W 7 X Y Z
=cN< U]-8#/$Fc=d^ 2 S 1 4 8 -1 6 7 1
=cN< U]-8#/$Fc=ddE=cNd^ 1 2 u S 7 -2 S 6 u
,S:c=cN< U]-8#/$Fc=ddE=cNdd 1 2 u S 7 2 S 6 u

Ahoia necesitamos encontiai en qu posicion se encuentia el menoi valoi uel
vectoi obs{x{1, 2:lenqtb{x))-x{1)). Paia encontiai valoies en un vectoi, NATLAB
uispone ue la funcion finJ, que uevuelve un vectoi con las posiciones ue los
elementos que cumplen cieita conuicion. En la figuia siguiente buscamos touas las
apaiiciones uel valoi 1 en el vectoi x: nos uice que el valoi 1 apaiece en las
posiciones 1, 4 y 1u. Este iesultauo (1, 4, 1u) es uevuelto en foima ue vectoi.
>> x

x =

1 2 S 1 4 8 -1 6 7 1

>> finu(x==1)

ans =

1 4 1u
P*/(%, UZ
Basta ahoia, sabemos extiaei un subvectoi hacienuo alguna tiansfoimacion al
vectoi oiiginal (como en el caso ue obs{x{1, 2:lenqtb{x))-x{1))) y calculai el minimo
ue un vectoi. Bien, pues busquemos en el vectoi obs{x{1, 2:lenqtb{x))-x{1)) las
posiciones en las que apaiece el valoi minimo: en la Figuia Su, le estamos uicienuo
a NATLAB que busque, en el vectoi obs{x{1, 2:lenqtb{x))-x{1)), su valoi minimo.
NATLAB iesponue uicienuo que el valoi minimo est en las posiciones S y 9.
46 ejercicios resueltos Je HATlAB
S9

>> finu(abs(x(1, 2:length(x))-x(1))==min(abs(x(1, 2:length(x))-x(1))))

ans =

S 9
P*/(%, V\
Nos inteiesa iealmente queuainos solo con el piimei elemento. Como el iesultauo
uevuelto poi finJ es un vectoi, extiaemos el piimei elemento: piimeio, asignamos
a una vaiiable auxiliai, a la que llamamos z, el vectoi que contiene las posiciones
uel valoi minimo; luego, leemos el piimei elemento ue ese vectoi z.
>> z=finu(abs(x(1, 2:length(x))-x(1))==min(abs(x(1, 2:length(x))-x(1))))

z =

S 9

>> z(1)

ans =

S
P*/(%, VN
Paia ii teiminanuo, iecoiuemos que el valoi que nos inteiesa uevolvei tiene que
hacei iefeiencia a la posicion en el vectoi oiiginal, x. Poi ello, uevolveiemos
iealmente z{1)-1:
>> z(1)+1

ans =

4
P*/(%, VU
Llevemos touo esto a una funcion ue NATLAB (Funcion S4):
1) Piimeio compiobamos la coiieccion ue los aigumentos.
2) Luego mostiamos el valoi uel vectoi oiiginal, v (notese que tenemos una
instiuccion compuesta simplemente ue la palabia v sin punto y coma al
final: la supiesion uel punto y coma hace que, al ejecutai esta
instiuccion, se muestie el valoi ue v; tambin lo hemos quitauo en las
siguientes lineas, paia vei en la consola ue NATLAB como va
evolucionanuo el iesultauo).
S) A continuacion, en una vaiiable a la que llamamos
vectorBesJeloPosicion2 colocamos los elementos uel vectoi oiiginal
uesue la posicion 2 hasta el final.
4) En voloresAbsolutos guaiuamos un nuevo vectoi con el valoi absoluto ue
las uifeiencias iespecto uel piimei elemento ue v.
Hocorio Polo 0soolo
4u
S) En minimo guaiuamos el valoi minimo ue los valoies absolutos ue las
uifeiencias.
6) En posicionesBelosHinimos guaiuamos un vectoi con las posiciones en
las que se encuentia el valoi minimo.
7) Finalmente, uevolvemos en p la posicion uel piimei elemento ue
posicionesBelosHinimos, que es el elemento ms ceicano a v{1).
function p = distanciaAlPrimero2(v)
if (nargin==0)
v=rand(1,10)*10;
end

if (length(v)<=2)
p=-1;
return;
end

v
vectorDesdeLaPosicion2=v(1, 2:length(v))
valoresAbsolutos=abs(vectorDesdeLaPosicion2-v(1))
minimo=min(valoresAbsolutos)
posicionesDeLosMinimos=find(valoresAbsolutos==minimo)
p=posicionesDeLosMinimos(1)+1
end

P(#)*+# V6
Si ejecutamos la funcion, el iesultauo es el siguiente:
>> uistanciaAlPiimeio2(x)
v =
1 2 S 1 4 8 -1 6 7 1

vectoiBesueLaPosicion2 =
2 S 1 4 8 -1 6 7 1

valoiesAbsolutos =
1 2 u S 7 2 S 6 u

minimo =
u

posicionesBeLosNinimos =
S 9

p =
4

ans =
4
P*/(%, VV
46 ejercicios resueltos Je HATlAB
41
J98%)*)*& NVO HT08%&: .%*0&:
J:)%*S, (#, @(#)*+# R(8 '8$8%0*#8 :* 8- #T08%& R(8 :8 -8 .,:, )&0&
.,%C08$%& 8: & #& .%*0&O
Solucion 1.
0n nmeio es piimo cuanuo solo pueue uiviuiise poi si mismo y poi 1. 0n nmeio
es uivisible poi otio cuanuo el iesto ue la uivision enteia es u. Ya vimos que
NATLAB uispone ue la funcion moJ{x, y), que uevuelve el iesto ue la uivision
enteia ue x entie y.
0na piimeia foima ue iesolvei el pioblema es ii uiviuienuo el nmeio n poi 1, poi
S, etcteia, hasta llegai a n. Si el nmeio ue uivisoies encontiauos es 2, entonces el
nmeio es piimo:
function result = esPrimo1(n)
numeroDeDivisores=0;

for i=1:n
if mod(n, i)==0
numeroDeDivisores=numeroDeDivisores+1;
end
end

if numeroDeDivisores==2
result=1;
else
result=0;
end

end

P*/(%, V6
0n pequeo cambio que pouemos haceile a la funcion est en el ltimo if: en lugai
ue pieguntai cuntos uivisoies hay y asignai a result, pouemos asignai
uiiectamente el iesultauo ue computai numeroBeBivisores==2, que uevuelve 1 o u
en funcion ue que el iesultauo sea cieito o falso:
function result = esPrimo1(n)
numeroDeDivisores=0;

for i=1:n
if mod(n, i)==0
numeroDeDivisores=numeroDeDivisores+1;
end
end

result= numeroDeDivisores==2;
end

P(#)*+# VW
Hocorio Polo 0soolo
42
Solucion 2.
La solucion anteiioi, no obstante, es muy ineficiente, poique hacemos siempie n
uivisiones. Pouiiamos empezai a uiviuii poi 2 y paiai a la mitau ue n: si no
encontiamos uivisoies, entonces el nmeio es piimo.
function result = esPrimo3(n)
numeroDeDivisores=0;
for i=2:n/2
if mod(n, i)==0
numeroDeDivisores=numeroDeDivisores+1;
end
end
result= numeroDeDivisores==0;
end

P(#)*+# V7
Solucion S.
Aunque la solucion anteiioi es ms eficiente, piobablemente pouamos aveiiguai si
n es piimo antes ue llegai a la mitau ue n. En lugai ue iecoiiei con un for, pouemos
utilizai un wbile que se uetenga o bien cuanuo se llegue a la mitau ue n, o bien
cuanuo se encuentie un uivisoi entie 2 y n,2:
function result = esPrimo4(n)
numeroDeDivisores=0;

i=2;
while (i<=n/2 && numeroDeDivisores==0)
if mod(n, i)==0
numeroDeDivisores=numeroDeDivisores+1;
end
i=i+1;
end
result= numeroDeDivisores==0;
end

P(#)*+# VX
Solucion 4.
0na vaiiante, an ms ipiua, consiste en buscai hasta la iaiz cuauiaua ue n, en
lugai ue hasta la mitau. La funcion ue NATLAB paia la iaiz cuauiaua es sqrt{x):
function result = esPrimo5(n)
tic;
numeroDeDivisores=0;

i=2;
while (i<=sqrt(n) && numeroDeDivisores==0)
if mod(n, i)==0
numeroDeDivisores=numeroDeDivisores+1;
46 ejercicios resueltos Je HATlAB
4S
end
i=i+1;
end
result= numeroDeDivisores==0;
toc;
end

P(#)*+# VY
Solucion S.
0na ltima posicion pasa poi el uso ue la funcion isprime{x) ue NATLAB, que
uevuelve 1 si x es piimo y 0 en caso contiaiio.

Hocorio Polo 0soolo
44
J98%)*)*& N6O b8)$&% )&# -&: n .%*08%&: #T08%&: .%*0&:
J:)%*S, (#, @(#)*+# R(8 '8;(8-;, (# ;8)$&% )&# -&: n .%*08%&: #T08%&:
.%*0&:O
Solucion 1 (eiionea).
0na solucion incoiiecta, peio en la que es fcil caei, consiste en uisponei ue un
bucle for uesue 1 hasta n, e ii pieguntanuo si i es piimo. En caso afiimativo, lo
aauimos al iesultauo. Es uecii:
function result = vectorNPrimerosPrimosMalo(n)
result=[];

for i=1:n
if (isprime(i))
result=[result i];
end
end
end
P(#)*+# VZO ?#, ;8%:*+# *#)&%%8)$, '8- ,-/&%*$0& :&-*)*$,'&
El couigo anteiioi no funciona bien, poique uevuelve un vectoi ue piimos, peio no
con los n piimeios, sino con los que estn entie 1 y n:
>> vectoiNPiimeiosPiimosNalo(1u)

ans =

2 S S 7
P*/(%, VW
0bsivese que usamos (en la Funcion S9) la funcion ue NATLAB isPrime, en lugai
ue cualquieia ue las que hemos esciito antes.
Solucion 2.
La solucion entonces es sencilla: en lugai ue ii ue maneia fija uesue 1 a n con un for,
iiemos aauienuo elementos mientias que no hayamos encontiauo n nmeios: es
uecii, mientias (wbile) el nmeio ue elementos en el vectoi iesultauo sea menoi
que n.
46 ejercicios resueltos Je HATlAB
4S
function result = vectorNPrimerosPrimos1(n)
result=[];

i=1;
while (length(result)<n)
if (isprime(i))
result=[result i];
end
i=i+1;
end
end

P(#)*+# 6\
Ahoia, el iesultauo que nos ua NATLAB es:
>> vectoiNPiimeiosPiimos1(1u)

ans =

2 S S 7 11 1S 17 19 2S 29
P*/(%, V7
Notese, en la figuia anteiioi, que el vectoi result no contiene el valoi 1. Be hecho,
NATLAB no consiueia que el 1 sea piimo:
>> ispiime(1)

ans =

u
P*/(%, VX

Hocorio Polo 0soolo
46
J98%)*)*& NWO b8)$&% )&# -&: n .%*08%&: #T08%&: .%*0&: &%'8#,'&: '8 0,A&%
, 08#&%
J:)%*S, (#, @(#)*+# R(8 '8;(8-;, (# ;8)$&% )&# -&: n .%*08%&: #T08%&:
.%*0&: &%'8#,'&: '8 0,A&% , 08#&%O
Solucion 1.
Paia iesolvei este ejeicicio pouemos aauii una sencilla linea al couigo ue la
Funcion 4u (pgina 4S), en la que llamamos a la funcion sort ue NATLAB. sort
oiuena un vectoi o una matiiz ue menoi a mayoi peio, si utilizamos el paimetio
JescenJ, lo oiuena uescenuentemente:
function result = vectorNPrimerosPrimosOrdenado1(n)
result=[];

i=1;
while (length(result)<n)
if (isprime(i))
result=[result i];
end
i=i+1;
end

result=sort(result, 'descend');
end

P(#)*+# 6N
Solucion 2.
En el couigo anteiioi, en la linea que hay uentio uel if, aauimos caua valoi ue i que
vamos encontianuo al final uel vectoi (result=[result i]). En lugai ue hacei eso,
pouemos aauiilo al piincipio, esciibienuo result=[i result]:
function result = vectorNPrimerosPrimosOrdenado2(n)
result=[];

i=1;
while (length(result)<n)
if (isprime(i))
result=[i result];
end
i=i+1;
end

end
P(#)*+# 6U
El iesultauo ue la funciones vectorNPrimerosPrimos0rJenoJo1 (Funcion 41) y
vectorNPrimerosPrimos0rJenoJo2 (Funcion 42) es exactamente el mismo:
46 ejercicios resueltos Je HATlAB
47
>> vectoiNPiimeiosPiimos0iuenauo1(1u)

ans =

29 2S 19 17 1S 11 7 S S 2
>> vectoiNPiimeiosPiimos0iuenauo2(1u)

ans =

29 2S 19 17 1S 11 7 S S 2
P*/(%, VY

Hocorio Polo 0soolo
48
J98%)*)*& N7O D,-)(-,% 8- 8#[:*0& #T08%& .%*0&
J:)%*S, (#, @(#)*+# R(8 '8;(8-;, 8- n-xlmo #T08%& .%*0&< :*8#'& n 8- ;,-&%
.,:,'& )&0& .,%C08$%&O
Solucion 1.
0tilizaiemos la funcion isprime{x) paia ii geneianuo nmeios piimos hasta que un
contauoi llegue a n:
function result = enesimoPrimo( n )
contador=0;
i=2;

while contador<n
if isprime(i)==1
contador=contador+1;
end
if contador==n
result=i;
end
i=i+1;
end
end
P(#)*+# 6VO DC-)(-& '8- 8#[:*0& .%*0&


46 ejercicios resueltos Je HATlAB
49
J98%)*)*& NXO D&#$,% #T08%&: '*:$*#$&: 8# (# ;8)$&%
J:)%*S, (#, @(#)*+# R(8 '8;(8-;, )(C#$&: #T08%&: '*:$*#$&: ,.,%8)8# 8# 8-
;8)$&% R(8 :8 .,:, )&0& .,%C08$%&O
Solucion 1.
0na foima ue haceilo a mano, que tiataiemos ue imitai, es la siguiente:
iecoiieiemos el vectoi v que nos pasan como paimetio uesue el piincipio hasta el
final con un for; en caua iteiacion, miiamos si el valoi i-simo ya se encuentia en
un vectoi ouxilior que habiemos constiuiuo pieviamente inicializnuolo a vacio: si
el valoi est, no lo aauimos; si no est, lo aauimos. Como iesultauo,
uevolveiemos el tamao uel vectoi auxiliai:
.&:*)*+# N U V 6 W 7 X Y Z N\
;^ 1 2 S 1 4 8 -1 6 7 1
,(=*-*,%^ 1 2 S 4 8 -1 6 7

La solucion pouemos implementaila como en la Funcion 44: cieamos el vectoi
ouxilior vacio; luego, en el bucle, almacenamos en un vectoi oporicionesBevi las
veces que apaiece el nmeio v{i) en el vectoi ouxilior. Si no apaiece ninguna vez
(es uecii, si la longituu uel vectoi oporicionesBevi es ceio), entonces lo aauimos.
Al final, uevolvemos la longituu uel vectoi ouxilior como iesultauo.
function result = numerosDistintos1( v )
auxiliar=[];

for i=1:length(v)
aparicionesDeVi=find(auxiliar==v(i));
if length(aparicionesDeVi)==0
auxiliar=[auxiliar v(i)];
end
end
result=length(auxiliar);
end

P(#)*+# 66
0n pai ue ejemplos ue la ejecucion son:
>> x

x =

1 2 S 1 4 8 -1 6 7 1

>> numeiosBistintos1(x)

ans =

8
>> z=|1 1 1 1 2 S 1j

z =

1 1 1 1 2 S 1

>> numeiosBistintos1(z)

ans =

S
P*/(%, VZ
Hocorio Polo 0soolo
Su
J98%)*)*& NYO I8:)&0.&:*)*+# 8# @,)$&%8: .%*0&: c"d
J:)%*S, (#, @(#)*+# R(8 '8;(8-;, (# ;8)$&% )&# -&: @,)$&%8: .%*0&: '8-
#T08%& R(8 :8 .,:, )&0& .,%C08$%&O
Solucion 1.
Lo que hacemos habitualmente a mano es, como se muestia a continuacion,
encontiai el menoi nmeio piimo poi el que n es uivisible: cuanuo lo encontiamos,
lo guaiuamos, calculamos el cociente y seguimos hasta que el cociente sea 1.

vamos a pioceuei exactamente ue la misma foima, apiovechanuo la funcion
enesimoPrimo que esciibimos en la Funcion 4S (pgina 48): mientias el cociente
(que inicialmente es n, peio que se va actualizanuo segn vayamos encontianuo
factoies piimos) sea uistinto ue 1, buscamos (en el wbile aniuauo) el piimei
nmeio piimo que uiviue al cociente: cuanuo lo encontiamos, lo aauimos al
vectoi result y actualizamos el cociente al valoi que tenia uiviuiuo poi el nmeio
piimo que acabamos ue encontiai.
function result = factoresPrimos1( n )
result=[];

cociente=n;
while (cociente~=1)
i=1;
while (mod(cociente, enesimoPrimo(i))~=0)
i=i+1;
end
result=[result enesimoPrimo(i)];
cociente=floor(cociente/enesimoPrimo(i));
end

end

P(#)*+# 6WO DC-)(-& '8 -&: @,)$&%8: .%*0&: '8 n
Los uos ejemplos manusciitos que veiamos aiiiba son:
46 ejercicios resueltos Je HATlAB
S1
>> factoiesPiimos1(12u)

ans =

2 2 2 S S
>> factoiesPiimos1(27)

ans =

S S S
P*/(%, 6\

Hocorio Polo 0soolo
S2
J98%)*)*& NZO I8:)&0.&:*)*+# 8# @,)$&%8: .%*0&: c""d
J:)%*S, (#, @(#)*+# R(8 '8;(8-;, (#, 0,$%*Q )&# '&: @*-,:] 8# -, .%*08%,
,.,%8)8%C# -&: @,)$&%8: .%*0&: '8- #T08%& R(8 :8 .,:, )&0& .,%C08$%&_ 8#
-, :8/(#',< -&: 8=.&#8#$8: '8 '*)F&: @,)$&%8: .%*0&:O
>&% 8980.-&< .,%, 8- #T08%& NU\< R(8 8: U
V
jVjW< :8 '8;&-;8%C -, :*/(*8#$8
0,$%*Q]
U V W
V N N

Solucion 1.
Bel ejeicicio anteiioi tenemos la funcion que uevuelve un vectoi con los factoies
piimos uel n que pasamos como paimetio. Bel 12u, poi ejemplo, obtenemos el
siguiente vectoi:
.&:*)*+# N U V 6 W
%8:(-$^ 2 2 2 S S
Lo que haiemos sei esciibii una nueva funcion que haga lo siguiente:
1) uuaiuaiemos los factoies piimos ue n en un vectoi foctores, que
constiuiiemos llamanuo a la Funcion 4S (pagina Su).
2) Cieaiemos uos vectoies: uno paia guaiuai los factoies que encontiemos (el
2, el S y el S en el ejemplo uel nmeio 12u) y otio paia guaiuai los
exponentes (S, 1 y 1 en el mismo ejemplo). Llamaiemos a estos vectoies,
iespectivamente, filoIoctores y filoFxponentes. Cuanuo los hayamos
completauo, los utilizaiemos paia uevolvei la matiiz iesultante.
S) Recoiieiemos touos los valoies que tengamos en el vectoi foctores. Si el
valoi i-simo no est en filoIoctores, lo aauimos al final y aauimos
tambin un 1 al final ue filoFxponentes. Si el valoi ya estuvieia, entonces
basta con inciementai en uno el valoi coiiesponuiente en filoFxponentes.
4) Finalmente, uevolveiemos una matiiz foimaua poi filoIoctores y
IiloFxponentes.
Esto es lo que se hace en la funcion siguiente:
46 ejercicios resueltos Je HATlAB
SS
function result = factoresPrimos2( n )
factores=factoresPrimos1(n);

filaFactores=[];
filaExponentes=[];
for i=1:length(factores)
factorI=factores(i);
posicionDelFactor=find(filaFactores==factorI);
if length(posicionDelFactor)==0
filaFactores=[filaFactores factorI];
filaExponentes=[filaExponentes 1];
else
filaExponentes(posicionDelFactor(1))=
filaExponentes(posicionDelFactor(1))+1;
end
end
result=[filaFactores; filaExponentes];
end



P(#)*+# 67O I8;&-()*+# '8 -&: @,)$&%8: .%*0&: 8# '&: ;8)$&%8:
Notese que la matiiz iesultauo la constiuimos utilizanuo coichetes y el opeiauoi
punto y coma paia sepaiai las filas que componuin la matiiz:
result=[filaFactores; filaExponentes];
Bagamos una tiaza ue ejemplo con el nmeio 12u. Como uetalle, notese que en la
vaiiable posicionBelIoctor guaiuamos el iesultauo ue ejecutai la funcion finJ ue
NATLAB, que uevuelve un vectoi con las posiciones ue los elementos que cumplen
cieita conuicion. Si ninguno ue los elementos la cumple, posicionBelIoctor estai
vacio.
D&08#$,%*&: @,)$&%8: * @,)$&%" .&:*)*&#I8-P,)$&% @*-,P,)$&%8: @*-,J=.&#8#$8:
|2 2 2 S Sj | j | j
1 2 | j
El if es cieito 1 2 | j | 2 j | 1 j
2 2 | 1 j | 2 j | 1 j
El if es falso 2 2 | 1 j | 2 j | 2 j
S 2 | 1 j | 2 j | 2j
El if es falso S 2 | 1 j | 2 j | S j
4 S | j | 2 j | S j
El if es cieito 4 S | j | 2 S j | S 1 j
S S | j | 2 S j | S 1 j
El if es cieito S S | j | 2 S Sj | S 1 1 j
Y oqui se termino el bucle porque se bo lleqoJo o i=S, que es lo lonqituJ Jel vector Je entroJo.
P*/(%, 6NO 3%,Q, '8 -, P(#)*+# 67 .,%, n=120
Si ejecutamos la funcion en NATLAB, el iesultauo es:
>> factoiesPiimos2(12u)

ans =

2 S S
S 1 1
P*/(%, 6U
Hocorio Polo 0soolo
S4
J98%)*)*& U\O 1C=*0& )&0T# '*;*:&%
J:)%*S, (#, @(#)*+# R(8 '8;(8-;, 8- 0C=*0& )&0T# '*;*:&% '8 n A mO
Solucion 1.
Lo habitual es hacei la uescomposicion en factoies piimos ue n y m y, luego, tomai
los factoies comunes con su menoi exponente. Poi ejemplo, paia calculai el
mximo comn uivisoi ue 48 y 6u, hacemos:
48=2
4
S
6u=2
2
SS
Con lo que el mcJ es 2
2
S=12.
Si aplicamos la Funcion 46 a los nmeios 48 y 6u, obtenemos las uos siguientes
matiices a las que, poi entenueinos, llamaiemos m48 y m60:
06Y
2 S
07\
2 S S
4 1 2 1 1

Lo que vamos a hacei es iecoiiei los factoies (la fila 1) ue m48 y vei si estn en los
factoies ue m60. En caso afiimativo, aauiiemos a una vaiiable result ue
acumulacion el factoi comn multiplicauo poi el menoi exponente ue los uos.
function result = mcd1(n, m)
fpN=factoresPrimos2(n);
fpM=factoresPrimos2(m);

factoresN=fpN(1, :);
exponentesN=fpN(2, :);

factoresM=fpM(1, :);
exponentesM=fpM(2, :);

result=1;
for i=1:length(factoresN)
posicionEnM=find(factoresM==factoresN(i));
if (length(posicionEnM)>0)
exponente=min(exponentesN(i),
exponentesM(posicionEnM(1)));
result=result*factoresN(i)^exponente;
end
end
end

P(#)*+# 6X
Solucion 2.
0tia solucion elegante viene uaua poi la aplicacion uel olqoritmo Je FucliJes: paia
calculai el mcJ ue n y m se hace lo siguiente:
46 ejercicios resueltos Je HATlAB
SS
1) Si m==0, entonces mcJ{n, m)=n y paiamos.
2) Si no, mcJ{n, m)=mcJ{m, r), uonue r es el iesto ue n entie m.
Se tiata, como se ve, ue una funcion iecuisiva peio que es muy fcil ue
implementai:
function result = mcd2Euclides(n, m)
if m==0
result=n;
else
r=mod(n, m);
result=mcd2Euclides(m, r);
end
end

P(#)*+# 6Y

Hocorio Polo 0soolo
S6
J98%)*)*& UNO 3,S-8%& '8 ,98'%8Q
J:)%*S*% (#, @(#)*+# R(8 '*S(98 (# $,S-8%& '8 ,98'%8QO 4,: ),:*--,: #8/%,: :8
*#'*),%C# )&# H A -,: S-,#),: )&# 5O
Solucion 1.
El tableio ue ajeuiez es un cuauiauo ue 8x8 casillas. Sabienuo que la casilla
supeiioi izquieiua es blanca, a paitii ue ella pouemos coloieai touas las uems.
Bicha casilla est en la posicion (1, 1): si nos uamos cuenta, son blancas las casillas
cuya suma ue fila y columna es pai, y negias las uems.
0na funcion que uibuja el tableio es la siguiente:
function tablero = tablero()
tablero=char(8,8);

for i=1:1:8
for j=1:1:8
if (mod(i+j, 2)==0)
tablero(i,j)='B';
else
tablero(i,j)='N';
end
end
end
end

P(#)*+# 6Z
0bsivese que la vaiiable toblero, que almacena el iesultauo, se inicializa a una
matiiz ue 8x8 caiacteies, ya que en sus posiciones colocaiemos letias.
Si la ejecutamos, el iesultauo es:
>> tableio

ans =

BNBNBNBN
NBNBNBNB
BNBNBNBN
NBNBNBNB
BNBNBNBN
NBNBNBNB
BNBNBNBN
NBNBNBNB
P*/(%, 6V

46 ejercicios resueltos Je HATlAB
S7
J98%)*)*& UUO 2-@*-
J:)%*S, (#, @(#)*+# 8# 123425 R(8 $&08 )&0& .,%C08$%&: -, .&:*)*+# c@*-,
A )&-(0#,d '8 (# ,-@*- 8# 8- $,S-8%& '8 ,98'%8Q A 0(8:$%8 $&'&: :(: .&:*S-8:
0&;*0*8#$&: )&# (# ,:$8%*:)&O
Solucion 1.
El alfil se mueve en uiagonal: un alfil como el ue la figuia, situauo en la fila 4,
columna 4, pueue moveise a touas las casillas sealauas con el asteiisco. Si nos
fijamos, la suma ue la fila y columna ue las casillas ue la uiagonal ascenuente es
siempie 8 (igual que la posicion en la que est situauo el alfil); iespecto ue las que
estn en la uescenuente, suceue que la iesta ue sus columna y fila es ceio, igual que
la iesta ue la posicion oiiginal uel alfil.
1 2 S 4 S 6 7 8
1 * *
2 * *
S * *
4 A
S * *
6 * *
7 * *
8 *
Becha esta obseivacion, la solucion es muy sencilla:
function t = alfil( col, fila )
t=tablero();
for i=1:1:8
for j=1:1:8
if (i+j==col+fila || i-j==col-fila)
t(i,j)='*';
end
end
end
end

P(#)*+# W\O ?#, :&-()*+# @C)*- '8 *0.-808#$,%< .8%& #& 0(A 8@*)*8#$8< .,%, -&: 0&;*0*8#$&: '8- ,-@*-
Y, si llamamos a la funcion, obtenemos:
>> alfil(4, 4)
ans =
*NBNBN*N
N*NBN*NB
BN*N*NBN
NBN*NBNB
BN*N*NBN
N*NBN*NB
*NBNBN*N
NBNBNBN*
>> alfil(4, 1)
ans =
BNB*BNBN
NB*BNBNB
B*BNBNBN
*BNBNBNB
B*BNBNBN
NB*BNBNB
BNB*BNBN
NBNB*BNB
P*/(%, 66
Hocorio Polo 0soolo
S8
Notese que, si pasamos los valoies ue los paimetios inteicambiauos (en lugai ue
4,1 pasamos 1,4), el iesultauo ue la ueiecha ue la figuia anteiioi cambia:
>> alfil(4, 4)
ans =
*NBNBN*N
N*NBN*NB
BN*N*NBN
NBN*NBNB
BN*N*NBN
N*NBN*NB
*NBNBN*N
NBNBNBN*
>> alfil(1,4)
ans =
BNB*BNBN
NB*B*BNB
B*BNB*BN
*BNBNB*B
BNBNBNB*
NBNBNBNB
BNBNBNBN
NBNBNBNB
P*/(%, 6WO J- %8:(-$,'& '8%8)F& '8 -, P*/(%, 66 ),0S*, :* ,-$8%,0&: 8- &%'8# '8- ;,-&% '8 -&:
.,%C08$%&:
Solucion 2.
Aunque funciones, la solucion anteiioi no es, ue touos mouos, uemasiauo eficiente,
ya que pasa poi las 64 casillas uel tableio. Si lo hacemos a mano, no nos hace falta
ii iecoiiienuo touas las casillas paia sabei si una casilla uaua es alcanzable o no
poi el alfil.
Paia maicai, sobie un tableio ue veiuau y manualmente, las casillas alcanzables
poi un alfil, basta con que vayamos movinuonos en cuatio uiiecciones y visitanuo
muchas menos casillas: aiiiba, ueiecha; abajo, ueiecha; aiiiba, izquieiua; abajo,
izquieiua. Esto lo pouemos conseguii con cuatio bucles wbile (Funcion S1), uno
paia los movimientos en caua uiieccion. Tenienuo en cuenta que, en NATLAB, la
piimeia fila (la fila 1) es la ue aiiiba, la piimeia columna (columna 1) es la ue la
izquieiua y que paia colocai un elemento en una matiiz se pasa piimeio la fila y
luego la columna, tenemos que:
1) Noveinos hacia ,%%*S, A , -, '8%8)F, significa inciementai la columna y
ueciementai la fila. 0samos uos vaiiables i y j paia ii maicanuo la casilla en
la que queiemos colocai el asteiisco: paitienuo ue la posicion inicial (que
viene uaua poi los paimetios col, filo), ueciementamos la fila (i) e
inciementamos la columna (j) mientias estemos uentio ue los limites uel
tableio.
2) Noveinos hacia ,S,9& A , -, '8%8)F, equivale a inciementai la columna e
inciementai la fila. Ahoia, inciementamos i y j en caua vuelta uel bucle
mientias estemos uentio uelos limites uel tableio.
S) Noveinos hacia ,%%*S, A , -, *QR(*8%', equivale a ueciementai tanto la
columna como la fila. Ahoia, iestamos 1 a i y 1 a j en caua vuelta uel bucle
mientias estemos uentio uelos limites uel tableio.
4) Noveinos hacia ,S,9& A , -, *QR(*8%', implica el ueciemento ue la
columna y el inciemento ue la fila: mientias estemos uentio uelos limites
uel tableio, sumamos 1 a i y iestamos 1 a j.
46 ejercicios resueltos Je HATlAB
S9
function t = alfil2( col, fila )
t=tablero();

% Derecha, arriba
i=fila;
j=col;
while (i>=1 && j<=8)
t(i, j)='*';
i=i-1;
j=j+1;
end

% Derecha, abajo
i=fila;
j=col;
while (i<=8 && j<=8)
t(i, j)='*';
i=i+1;
j=j+1;
end

% Izquierda, arriba
i=fila;
j=col;
while (i>=1 && j>=1)
t(i, j)='*';
i=i-1;
j=j-1;
end

% Izquierda, abajo
i=fila;
j=col;
while (i<=8 && j>=1)
t(i, j)='*';
i=i+1;
j=j-1;
end
end
P(#)*+# WNO 1&;*0*8#$&: '8- ,-@*-< )&#:8/(*'&: )&# 08#&% )&:$8
Solucion S.
Es impoitante que el couigo que esciibamos sea legible, fcil ue usai poi teiceias
peisonas y, en la meuiua ue lo posible, fcil ue entenuei. Respecto uel couigo ue las
uos soluciones que hemos uauo paia el movimiento uel alfil, un pequeo uetalle
mejoiable es que la funcion ieciba los paimetios en el mismo oiuen en que se
utilizan en las matiices ue NATLAB: es uecii, si NATLAB usa la notacion filo,
columno paia colocai un valoi en la matiiz, queua mejoi que la funcion olfil tome
tambin los paimetios en ese oiuen. Esto hai ms uificil que el usuaiio ue
nuestia funcion se equivoque.
Hocorio Polo 0soolo
6u
Ya que los valoies ue los paimetios col y filo se usan solo paia iealizai
asignaciones, pouemos mouificai la cabeceia ue la funcion paia que los
paimetios se pasen en el oiuen habitual. Es uecii, uejai la cabeceia como en la
Funcion S2:
function t = alfil3( fila, col)
% Todo el cdigo de la funcin exactamente igual

.
end
P(#)*+# WUO 4, 0*:0, P(#)*+# WN< .8%& )&# -&: .,%C08$%&: *#$8%),0S*,'&:

46 ejercicios resueltos Je HATlAB
61
J98%)*)*& UVO J- ),S,--& '8 ,98'%8Q
J:)%*S*% (#, @(#)*+# 8# 123425 R(8 $&08 )&0& .,%C08$%&: -, .&:*)*+# c@*-,
A )&-(0#,d '8 (# ),S,--& 8# 8- $,S-8%& '8 ,98'%8Q A 0(8:$%8 $&'&: :(:
.&:*S-8: 0&;*0*8#$&: )&# (# ,:$8%*:)&O
Solucion 1.
Be maneia geneial, en este tipo ue pioblemas (como en el anteiioi, uel alfil) se
tiata ue encontiai algn pation que ielacione la posicion ue oiigen con las
posibles posiciones ue uestino.
En el caso uel caballo uel ajeuiez, el movimiento es en L, a ueiecha e izquieiua y
hacia aiiiba y abajo, como se muestia en el tableio siguiente, ue maneia que el
nmeio ue casillas ue la L que pueue moveise es ties: uos a la ueiechaizquieiua y
una aiiibaabajo, o una a la ueiechaizquieiua y uos aiiibaabajo.
1 2 S 4 S 6 7 8
1
2 * *
S * *
4 C
S * *
6 * *
7
8
Poi cambiai un poco el punto ue vista ue la solucion iespecto uel ejeicicio anteiioi
uel alfil, haiemos ahoia lo siguiente:
1) A paitii ue la posicion inicial (que venui en el oiuen filo, col), moveiemos
una columna a la ueiecha (en el ejemplo ue aiiiba, iiemos a la casilla 4,S).
0na vez aqui, colocamos un asteiisco uos filas aiiiba y uos filas abajo. Asi,
habiemos colocauo los asteiiscos en (2,S) y (6,S).
2) volvemos a la posicion inicial y movemos uos casillas a la ueiecha. Luego,
colocamos el asteiisco una fila aiiiba y una fila abajo.
S) 0tia vez uesue la posicion inicial, nos movemos una a la izquieiua y
colocamos un asteiisco uos filas aiiiba y uos filas abajo.
4) Poi ltimo, nos movemos uos columnas a la izquieiua y colocamos el
asteiisco uos filas aiiiba y uos filas abajo.
0bviamente, tenemos que contiolai que no nos salgamos ue los limites uel tableio,
que vienen uauos poi los valoies 1 a 8 paia la fila y la columna.
La solucion que uamos en la Funcion SS simula estos cuatio bloques ue
movimientos. 0tilizamos uos vaiiables auxiliaies i y j paia uenotai
iespectivamente la fila y columna en que uebemos colocai los asteiiscos. En el
piimeio, poi ejemplo, asignamos a j el valoi uel paimetio col inciementauo en 1;
si estamos uentio uel tableio (es uecii, si j<=8), entonces iestamos 2 a la fila
(vaiiable i), volvemos a compiobai que estamos uentio uel tableio (i~=1) y, en
caso afiimativo, colocamos el asteiisco. Bacemos a continuacion lo mismo paia la
casilla situaua uos filas poi uebajo ue la oiiginal (i=filo-2).
Hocorio Polo 0soolo
62
function t = caballo1(fila, col)
t=tablero();

% 1 a la derecha, 2 arriba y abajo
j=col+1;
if j<=8
i=fila-2;
if i>=1
t(i, j)='*';
end
i=fila+2;
if (i<=8)
t(i, j)='*';
end
end

% 2 a la derecha, 1 arriba y abajo
j=col+2;
if j<=8
i=fila-1;
if i>=1
t(i, j)='*';
end
i=fila+1;
if (i<=8)
t(i, j)='*';
end
end

% 1 a la izquierda, 2 arriba y abajo
j=col-1;
if j>=1
i=fila-2;
if i>=1
t(i, j)='*';
end
i=fila+2;
if (i<=8)
t(i, j)='*';
end
end

% 2 a la izquierda, 1 arriba y abajo
j=col-2;
if j>=1
i=fila-1;
if i>=1
t(i, j)='*';
end
i=fila+1;
if (i<=8)
t(i, j)='*';
end
end
end

P(#)*+# WVO 1&;*0*8#$&: '8- ),S,--&
46 ejercicios resueltos Je HATlAB
6S
Solucion 2.
Si nos fijamos en los bloques ue couigo ue la Funcion SS, vemos que los uos
movimientos a la ueiecha son casi exactamente iguales entie si, como tambin los
uos movimientos a la izquieiua. En la Figuia 46 iesaltamos en amaiillo las
uifeiencias entie los movimientos hacia la ueiecha: cuanuo se suma 1 a la columna,
se iesta y suma 2 a la fila; cuanuo se suma 2 a la columna, se iesta y suma 1 a la fila.
% 1 a la derecha, 2 arriba y
abajo
j=col+1;
if j<=8
i=fila-2;
if i>=1
t(i, j)='*';
end
i=fila+2;
if (i<=8)
t(i, j)='*';
end
end

% 2 a la derecha, 1 arriba y
abajo
j=col+2;
if j<=8
i=fila-1;
if i>=1
t(i, j)='*';
end
i=fila+1;
if (i<=8)
t(i, j)='*';
end
end

P*/(%, 67O 4&: 0&;*0*8#$&: , -, '8%8)F, :&# 0(A .,%8)*'&: 8# -, P(#)*+# WV
Pouemos agiupai los uos tiozos ue couigo en uno solo, con un bucle for cuya
vaiiable ue contiol, a la que pouemos llamai sumo, vaya uesue 1 hasta 2 y que
utilizaiemos paia sumaila a la vaiiable j. Es uecii, sustituii ambos fiagmentos ue
couigo poi uno solo, como en la Figuia 47:
% Movimientos a la derecha
for suma=1:2
j=col+suma;
if j<=8
i=fila-2; % Si suma=1, restar 2; si suma=2, restar 1
if i>=1
t(i, j)='*';
end
i=fila+2; % Si suma=1, sumar 2; si suma=2, sumar 1
if (i<=8)
t(i, j)='*';
end
end
end
P*/(%, 6XO >,:& N '8- ,/%(.,0*8#$& 8# (#& '8 -&: '&: S-&R(8: '8 -, P*/(%, 67
En la figuia anteiioi, sumamos la vaiiable sumo a j: la piimeia vez se le suma 1, y la
segunua 2. Sin embaigo, nos falta actualizai auecuauamente los valoies que ueben
iestaise y sumaise y que hemos iesaltauo en moiauo. En este caso, cuanuo
sumo=1 hay que iestaisumai 2 o 1 segn sumo sea, iespectivamente, 1 o 2.
Este valoi que ueseamos sustituya al -2 y al +2 que apaiecen en moiauo lo
conseguimos con la expiesion S-sumo. El couigo paia el movimiento a la ueiecha,
entonces, queua ue la siguiente maneia:
Hocorio Polo 0soolo
64
function t = caballo2(fila, col)
t=tablero();

% Movimientos a la derecha
for suma=1:2
j=col+suma;
if j<=8
i=fila-(3-suma);
if i>=1
t(i, j)='*';
end
i=fila+(3-suma);
if (i<=8)
t(i, j)='*';
end
end
end

% 1 a la izquierda, 2 arriba y abajo
j=col-1;
if j>=1
i=fila-2;
if i>=1
t(i, j)='*';
end
i=fila+2;
if (i<=8)
t(i, j)='*';
end
end

% 2 a la izquierda, 1 arriba y abajo
j=col-2;
if j>=1
i=fila-1;
if i>=1
t(i, j)='*';
end
i=fila+1;
if (i<=8)
t(i, j)='*';
end
end
end

P(#)*+# W6O 1&;*0*8#$&: '8- ),S,--&< ,/%(.,#'& -&: 0&;*0*8#$&: , -, '8%8)F, 8# (# :&-& S-&R(8
Bel mismo mouo, agiupamos los movimientos a la izquieiua, ue mouo que la
funcion queua asi:
46 ejercicios resueltos Je HATlAB
6S
function t = caballo2(fila, col)
t=char(8,8);

for i=1:1:8
for j=1:1:8
t(i,j)='-';
end
end
t(fila, col)='C';

% Movimientos a la derecha
for suma=1:2
j=col+suma;
if j<=8
i=fila-(3-suma);
if i>=1
t(i, j)='*';
end
i=fila+(3-suma);
if (i<=8)
t(i, j)='*';
end
end
end

% Movimientos a la izquierda
for resta=1:2
j=col-resta;
if j>=1
i=fila-(3-resta);
if i>=1
t(i, j)='*';
end
i=fila+(3-resta);
if (i<=8)
t(i, j)='*';
end
end
end

end
P(#)*+# WWO 1&;*0*8#$&: '8- ),S,--&< )&# -&: 0&;*0*8#$&: , -, '8%8)F, A , -, *QR(*8%', 8# '&: for
0bseiva que, con objeto ue facilitai la lectuia uel iesultauo, en el couigo anteiioi
hemos sustituiuo la llamaua a la funcion toblero{) poi una inicializacion uel tableio
meuiante guiones, y que hemos aauiuo una instiuccion (iesaltaua en moiauo)
paia colocai una C en el lugai en que se encuentia el caballo. Bos ejemplos ue
ejecucion son los siguientes:
Hocorio Polo 0soolo
66
>> caballo2(4, 4)

ans =

--------
--*-*---
-*---*--
---C----
-*---*--
--*-*---
--------
--------
>> caballo2(4, 8)

ans =

--------
------*-
-----*--
-------C
-----*--
------*-
--------
--------
P*/(%, 6Y
Solucion S.
En una vuelta ue tueica ms, vemos tambin semejanzas entie los uos bucles for
ue la Funcion SS. Como vemos en la Figuia 49, en uno llamamos a la vaiiable sumo
y en otio resto (en amaiillo); otia uifeiencia (en moiauo), es que en uno sumamos
y en otio iestamos; la ltima uifeiencia (en veiue) es que en uno compaiamos j<=8
y en otio j~=1.
% Movimientos a la derecha
for suma=1:2
j=col+suma;
if j<=8
i=fila-(3-suma);
if i>=1
t(i, j)='*';
end
i=fila+(3-suma);
if (i<=8)
t(i, j)='*';
end
end
end
% Movimientos a la izquierda
for resta=1:2
j=col-resta;
if j>=1
i=fila-(3-resta);
if i>=1
t(i, j)='*';
end
i=fila+(3-resta);
if (i<=8)
t(i, j)='*';
end
end
end
P*/(%, 6ZO 4&: S()-8: '8 -&: 0&;*0*8#$&: , -, '8%8)F, A , -, *QR(*8%', :&# 0(A .,%8)*'&:
Bueno, pues es sencillo agiupai ambos bucles, como se hace en la Funcion S6: las
uos conuiciones (en veiue) las agiupamos en una sola (j~=1 && j<=8); como una
vez nos inteiesa sumai y otia iestai, nos inventamos una vaiiable nueva siqno que
tome valoi -1 y +1 y que usamos como vaiiable ue contiol ue un nuevo bucle for
(en amaiillo); esta vaiiable siqno la utilizamos (en moiauo) paia multiplicai poi
foctor, que sustituye a las antiguas vaiiables sumo y resto.
46 ejercicios resueltos Je HATlAB
67
function t = caballo3(fila, col)
t=char(8,8);

for i=1:1:8
for j=1:1:8
t(i,j)='-';
end
end
t(fila, col)='C';

for signo=-1:+2:1
for factor=1:2
j=col+signo*factor;
if j>=1 && j<=8
i=fila-(3-factor);
if i>=1
t(i, j)='*';
end
i=fila+(3-factor);
if (i<=8)
t(i, j)='*';
end
end
end
end
end
P(#)*+# W7O 3&'&: -&: 0&;*0*8#$&: '8- ),S,--& 8# '&: for ,#*','&:

Hocorio Polo 0soolo
68
J98%)*)*& U6O 1,$%*Q *'8#$*','
J:)%*S*% (#, @(#)*+# 8# 123425 R(8< :*# (:,% -, @(#)*+# eye, '8;(8-;, (#,
0,$%*Q *'8#$*',' '8 nxnO
Solucion 1.
La funcion eye{n) uevuelve uiiectamente la matiiz iuentiuau:
>> eye(S)

ans =

1 u u u u
u 1 u u u
u u 1 u u
u u u 1 u
u u u u 1
P*/(%, W\
Paia cumplii el enunciauo, constiuiiemos una matiiz ue nxn ceios y, luego,
iecoiieiemos la uiagonal piincipal (en sus posiciones coinciuen la fila y la
columna) y colocamos un 1.
En una piimeia solucion, iecoiiemos touas las posiciones ue la matiiz con uos
bucles aniuauos contiolauos poi i y j: si i==j, entonces la casilla es ue la uiagonal
piincipal y colocamos un 1:
function result = matrizIdentidad1(n)
result=zeros(n);

for i=1:n
for j=1:n
if i==j
result(i, j)=1;
end
end
end
end
P(#)*+# WXO 1,$%*Q *'8#$*',' %8)&%%*8#'& $&', -, 0,$%*Q
Solucion 2.
Claiamente, no es necesaiio iecoiiei touas las casillas ue la matiiz. Pouemos
iecoiiei, sencillamente, la uiagonal piincipal con un solo bucle for. Basta con
iecoiiei uesue 1 hasta n con una vaiiable i y colocal el 1 en {i, i):
46 ejercicios resueltos Je HATlAB
69
function result = matrizIdentidad2(n)
result=zeros(n);

for i=1:n
result(i, i)=1;
end
end
P(#)*+# WYO 1,$%*Q *'8#$*','< %8)&%%*8#'& :&-,08#$8 -, '*,/&#,- .%*#)*.,-

Hocorio Polo 0soolo
7u
J98%)*)*& UWO I*,/&#,- .%*#)*.,-
J:)%*S*% (#, @(#)*+# 8# 123425 R(8< :*# (:,% -, @(#)*+# Jlug, '8;(8-;, -&:
;,-&%8: :*$(,'&: 8# -, '*,/&#,- .%*#)*.,- '8 (#, 0,$%*Q R(8 :8 .,:, )&0&
.,%C08$%&O
Solucion 1.
La funcion Jioq{H) uevuelve uiiectamente, en foima ue vectoi, los valoies
ubicauos en la uiagonal piincipal ue la matiiz H:
>> N=|1 2 S 4; S 6 7 8; 9 1u 11 12; 1S 14 1S 16j

N =

1 2 S 4
S 6 7 8
9 1u 11 12
1S 14 1S 16
>> uiag(N)

ans =

1
6
11
16
P*/(%, WNO D&#:$%())*+# '8 (#, 0,$%*Q c*QR(*8%',d A 8=$%,))*+# '8 :( '*,/&#,- .%*#)*.,- )&# Jlug
Como el enunciauo nos piohibe usai la funcion Jioq, iecoiieiemos con un solo
buce for contiolauo poi una vaiiable i las posiciones {i, i):
function diagonal = diagonalPrincipal(M)
diagonal=[];

for i=1:length(M)
diagonal=[diagonal M(i, i)];
end
end
P(#)*+# WZO J=$%,))*+# '8 -, '*,/&#,- .%*#)*.,-
Al ejecutai, obtenemos esto:
>> N

N =

1 2 S 4
S 6 7 8
9 1u 11 12
1S 14 1S 16
>> uiagonalPiincipal(N)

ans =

1 6 11 16
P*/(%, WU
Si queiemos obtenei el vectoi tiaspuesto, paia uevolvei el iesultauo igual que lo
uevuelve la funcion Jioq (Figuia S1), basta con aauii la linea iesaltaua:
46 ejercicios resueltos Je HATlAB
71
function diagonal = diagonalPrincipal(M)
diagonal=[];

for i=1:length(M)
diagonal=[diagonal M(i, i)];
end
diagonal=diagonal';
end
P(#)*+# 7\O J=$%,))*+# '8 -, '*,/&#,- .%*#)*.,- )&0& (# ;8)$&% ;8%$*),-
Solucion 2.
Supongamos que uebemos compiobai que la matiiz que se pasa como paimetio
sea cuauiaua.
Si tenemos la siguiente matiiz no cuauiaua N:
N U V
N 1 2 S
U 4 S 6
V 7 8 9
6 1u 11 12
La funcion lenqtb{N) nos uevuelve el nmeio ue filas ue la matiiz:
>> N=|1 2 S; 4 S 6; 7 8 9; 1u 11 12j

N =

1 2 S
4 S 6
7 8 9
1u 11 12
>> length(N)

ans =

4
P*/(%, WVO D&#:$%())*+# '8 (#, 0,$%*Q #& )(,'%,', A )C-)(-& '8 :( -&#/*$('
Si queiemos conocei su nmeio ue columnas, uebemos extiaei una fila y calculai
su longituu. Paia extiaei una fila ue la matiiz usamos HATRlZ{numeroBeIilo, :):
>> N(1, :)

ans =

1 2 S
>> length(N(1, :))

ans =

S
P*/(%, W6O J=$%,))*+# '8 -, @*-, N '8 -, 0,$%*Q H c*QR(*8%',d A )C-)(-& '8 -, -&#/*$(' '8 8:, @*-,
Asi, aauimos a la funcion anteiioi el if que iesaltamos:
Hocorio Polo 0soolo
72
function diagonal = diagonalPrincipal(M)
if length(M)~=length(M(1, :))
disp('La matriz debe ser cuadrada');
return;
end

diagonal=[];

for i=1:length(M)
diagonal=[diagonal M(i, i)];
end
diagonal=diagonal';
end
P(#)*+# 7N
El iesultauo con las matiices H (cuauiaua) y N (no cuauiaua) es:
>> N

N =

1 2 S 4
S 6 7 8
9 1u 11 12
1S 14 1S 16

>> uiagonalPiincipal(N)

ans =

1
6
11
16

>> N

N =

1 2 S
4 S 6
7 8 9
1u 11 12

>> uiagonalPiincipal(N)
La matiiz uebe sei cuauiaua
P*/(%, WWO L8:(-$,'& '8 JlugonulPrlnclpul :&S%8 (#, 0,$%*Q )(,'%,', c*QR(*8%',d A (#, #& )(,'%,',

46 ejercicios resueltos Je HATlAB
7S
J98%)*)*& U7O 3%,Q, '8 (#, 0,$%*Q
J:)%*S*% (#, @(#)*+# 8# 123425 R(8 ),-)(-8 -, $%,Q, '8 (#, 0,$%*QO
Solucion 1.
La tiaza ue una matiiz es la suma ue los elementos situauos en su uiagonal
piincipal, poi lo que esta funcion es casi tiivial. Basta con iecupeiai la uiagonal
piincipal y sumai sus elementos.
0n solucion un poco laiga es la siguiente:
function result = traza1(M)
if length(M)~=length(M(1, :))
disp('La matriz debe ser cuadrada');
return;
end

diagonal=[];

for i=1:length(M)
diagonal=[diagonal M(i, i)];
end

result=0;
for i=1:length(diagonal)
result=result+diagonal(i);
end

end
P(#)*+# 7UO DC-)(-& '8 -, $%,Q, '8 (#, 0,$%*Q c"d
Solucion 2.
En una segunua apioximacion, pouemos iecupeiai la uiagonal piincipal llamanuo
a la funcion JioqonolPrincipol que constiuimos en la Funcion 61 (o a la funcion
Jioq ue NATLAB) y sumai sus valoies:
function result = traza2(M)
diagonal=diagonalPrincipal(M);

result=0;
for i=1:length(diagonal)
result=result+diagonal(i);
end

end
P(#)*+# 7VO DC-)(-& '8 -, $%,Q, '8 (#, 0,$%*Q c""d
Solucion S.
Poi ltimo, en lugai ue sumai los elementos con un bucle, como hacemos en la
Funcion 62 y en la Funcion 6S, pouemos sumai meuiante la funcion sum ue
NATLAB:
Hocorio Polo 0soolo
74
function result = traza3(M)
diagonal=diagonalPrincipal(M);
result=sum(diagonal);
end
P(#)*+# 76O DC-)(-& '8 -, $%,Q, '8 (#, 0,$%*Q c"""d
El couigo ue la funcion anteiioi lo pouemos agiupai en una sola linea:
function result = traza4(M)
result=sum(diagonalPrincipal(M));
end
P(#)*+# 7WO DC-)(-& '8 -, $%,Q, '8 (#, 0,$%*Q c"bd
0, como ueciamos, usai Jioq en lugai ue nuestia funcion JioqonolPrincipol:
function result = traza5(M)
result=sum(diag(M));
end
P(#)*+# 77O DC-)(-& '8 -, $%,Q, '8 (#, 0,$%*Q cbd
En geneial, las opeiaciones tan sencillas las pouemos esciibii uiiectamente en la
linea ue comanuos ue NATLAB:
>> N

N =

1 2 S 4
S 6 7 8
9 1u 11 12
1S 14 1S 16

>> sum(uiag(N))

ans =

S4
P*/(%, W7O DC-)(-& '8 -, $%,Q, '8 M '8:'8 -, -h#8, '8 )&0,#'&:

46 ejercicios resueltos Je HATlAB
7S
J98%)*)*& UXO ?#&: A )8%&: ,-$8%#,'&:
J:)%*S*% (#, @(#)*+# R(8 )&#:$%(A, (#, 0,$%*Q )(,'%,', '8 ,#)F(%, .,%<
@&%0,', .&% N A \ ,-$8%#,$*;&:O >&% 8980.-&< :* n=6:
N U V 6 W 7
N 1 u 1 u 1 u
U u 1 u 1 u 1
V 1 u 1 u 1 u
6 u 1 u 1 u 1
W 1 u 1 u 1 u
7 u 1 u 1 u 1
Solucion 1.
Tenemos muchas foimas ue iesolvei este ejeicicio. En una piimeia, pouemos
comenzai cieanuo una matiiz ue ceios (funcion zeros) y colocai un 1 en la posicion
(1, 1). Luego, vamos avanzanuo ue 2 en 2 columnas hasta llegai al limite ueiecho
(n-1). Esto lo haiiamos paia touas las filas impaies. Paia las paies, colocamos un 1
en la segunua columna y vamos avanzanuo ue 2 en 2 hasta llegai a la columna n.
function result = alternar1(n)
if mod(n, 2)~=0
disp('n debe ser par');
end

result=zeros(n);

% Filas impares
for fila=1:2:n-1
for columna=1:2:n-1
result(fila, columna)=1;
end
end

% Filas pares
for fila=2:2:n
for columna=2:2:n
result(fila, columna)=1;
end
end
end
P(#)*+# 7XO ?#&: A )8%&: ,-$8%#,'&: c"d
Solucion 2.
Igual que nos pasaba en el ejeicicio sobie los movimientos uel caballo (pgina 61),
los uos bucles son muy paieciuos. Si los compaiamos (Figuia S7), obseivamos que
si, en los uos bucles ue la izquieiua, esciibimos n en lugai ue n-1, el iesultauo sigue
sienuo vliuo.
Hocorio Polo 0soolo
76
% Filas impares
for fila=1:2:n-1
for columna=1:2:n-1
result(fila, columna)=1;
end
end
% Filas pares
for fila=2:2:n
for columna=2:2:n
result(fila, columna)=1;
end
end
P*/(%, WXO 4&: S()-8: '8 -,: @*-,: #&#8: A -,: .,%8: :&# 0(A .,%8)*'&:
Es uecii, que pouemos mouificai el bucle ue la izquieiua paia que queue como se
muestia:
% Filas impares
for fila=1:2:n
for columna=1:2:n
result(fila, columna)=1;
end
end
% Filas pares
for fila=2:2:n
for columna=2:2:n
result(fila, columna)=1;
end
end
P*/(%, WYO 4&: S()-8: '8 -,: @*-,: #&#8: A -,: .,%8: :&# 0(A .,%8)*'&:
Ambos bucles pueuen agiupaise en uno solo, que iecoiia touas las filas (uesue 1
hasta n) y que acte ue uifeiente maneia segn la fila sea impai o pai (es uecii,
segn moJ{filo, 2) sea 1 o u):
function result = alternar2(n)
if mod(n, 2)~=0
disp('n debe ser par');
end

result=zeros(n);

for fila=1:n
if mod(fila, 2)==1 % Si la fila es impar
for columna=1:2:n
result(fila, columna)=1;
end
else % Si es par
for columna=2:2:n
result(fila, columna)=1;
end
end
end
end
P(#)*+# 7YO ?#&: A )8%&: ,-$8%#,'&: c""d
Solucion S.
Pouemos simplificai un poco el couigo ue la funcion anteiioi si tenemos en cuenta
que, cuanuo la filo es impai, la columna en la que se coloca el piimei 1 es la 1 y que,
cuanuo la filo es pai, el piimei 1 se pone en la columna 2. Luego, sea pai o impai la
columna, se va inciementanuo la columna ue 2 en 2 hasta llegai a n. 0 sea:
46 ejercicios resueltos Je HATlAB
77
function result = alternar3(n)
if mod(n, 2)~=0
disp('n debe ser par');
end

result=zeros(n);

for fila=1:n
if mod(fila, 2)==1
columna=1;
else
columna=2;
end
for j=columna:2:n
result(fila, j)=1;
end
end
end



P(#)*+# 7ZO ?#&: A )8%&: ,-$8%#,'&: c"""d
Solucion 4.
Simplemente poi vaiiai un poco, pouemos ieesciibii la solucion anteiioi y utilizai
un wbile en vez ue un for: simplemente uebemos inicializai la vaiiable filo antes
uel bucle, esciibii auecuauamente su conuicion ue saliua (filo<=n) e inciementai al
final uel wbile paia que no se foime un bucle infinito:
function result = alternar4(n)
if mod(n, 2)~=0
disp('n debe ser par');
end

result=zeros(n);

fila=1;
while fila<=n
if mod(fila, 2)==1
columna=1;
else
columna=2;
end
for j=columna:2:n
result(fila, j)=1;
end
fila=fila+1;
end
end
P(#)*+# X\O ?#&: A )8%&: ,-$8%#,'&: c"bd
Hocorio Polo 0soolo
78
Solucion S.
0tia foima ms ue solucionai el ejeicicio consiste en geneiai uos vectoies
uistintos: uno paia las filas impaies y otio paia las paies. Luego, iecoiiemos las
filas ue la matiiz (pieviamente inicializaua a, poi ejemplo, ceios) y vamos
sustituyenuo caua fila poi filolmpor o filoPor:
function result = alternar5(n)
if mod(n, 2)~=0
disp('n debe ser par');
end

result=zeros(n);

filaImpar=[];
for columna=1:2:n
filaImpar(columna)=1;
end
filaImpar=[filaImpar 0];

filaPar=[];
for columna=2:2:n
filaPar(columna)=1;
end

for fila=1:n
if mod(fila, 2)==1
result(fila, :)=filaImpar;
else
result(fila, :)=filaPar;
end
end
end
P(#)*+# XNO ?#&: A )8%&: ,-$8%#,'&: cbd] :(:$*$(*0&: @*-,:
Como pequeo uetalle, notese la necesiuau ue aauii un ceio manualmente a las
filas impaies (linea iesaltaua en moiauo) paia que se queue ue la misma longituu
que las paies.
Poi otio lauo, vase la foima en que se mouifica una fila concieta en NATLAB: la
linea iesaltaua en veiue mouifica ue la vaiiable result la fila nmeio filo; al colocai
uos puntos (:) uespus ue la coma, inuicamos a NATLAB que sustituya toua la fila.
Solucion 6.
Igual que hemos iellenauo poi filas en la solucion anteiioi (Funcion 71), tambin
pouemos iellenai poi columnas. En este caso inicializamos uos vaiiables
columnolmpor y columnoPor y, luego, iecoiiemos touas las columnas, sustituyenuo
poi la que coiiesponua.
46 ejercicios resueltos Je HATlAB
79
function result = alternar6(n)
if mod(n, 2)~=0
disp('n debe ser par');
end

result=zeros(n);

columnaImpar=[];
for fila=1:2:n
columnaImpar(fila)=1;
end
columnaImpar=[columnaImpar 0]';

columnaPar=[];
for fila=2:2:n
columnaPar(fila)=1;
end
columnaPar=columnaPar';

for columna=1:n
if mod(columna, 2)==1
result(:, columna)=columnaImpar;
else
result(:, columna)=columnaPar;
end
end
end
P(#)*+# XUO ?#&: A )8%&: ,-$8%#,'&: cb"d] :(:$*$(*0&: )&-(0#,:
0bsivese en la figuia siguiente la uifeiencia, en los ltimos bucles for ue la
Funcion 71 (en que sustituiamos filas) y ue la Funcion 72 (sustituimos columnas),
sobie como sustituii una fila o una columna: paia mouificai una fila completa,
piimeio va el nmeio ue fila y luego uos puntos; paia mouificai una columna
completa, piimeio los uos puntos y uespus el nmeio ue columna:
result(fila, :)= filaImpar;

result(:, columna)= columnaImpar;

P*/(%, WZO B(:$*$()*+# '8 (#, @*-, c#T08%&< '&: .(#$&:d A '8 (#, )&-(0#, c'&: .(#$&:< )&-(0#,d
Solucion 7.
0na ltima solucion consiste en inicializai la matiiz a ceios (o a unos) y iecoiiei
uespus las nxn casillas ue la matiiz, colocanuo un 1 (o un u segn coiiesponua): el
1 se pone en las casillas cuya suma ue fila y columna sea pai.
Hocorio Polo 0soolo
8u
function result = alternar7(n)
if mod(n, 2)~=0
disp('n debe ser par');
end

result=zeros(n);

for fila=1:n
for columna=1:n
if mod(fila+columna, 2)==0
result(fila, columna)=1
end
end
end
end
P(#)*+# XVO ?#&: A )8%&: ,-$8%#,'&: cb""d] )&-&),0&: (# N 8# -,: ),:*--,: )(A,: fllu A columnu :(0,#
.,%
La veision en la que colocamos u en vez ue 1 necesita uos cambios: piimeio,
inicializai la matiiz a 1 (maicauo en amaiillo) y luego colocai el u en las casillas
cuya suma ue fila y columna sea non (moiauo):
function result = alternar8(n)
if mod(n, 2)~=0
disp('n debe ser par');
end

result=ones(n);

for fila=1:n
for columna=1:n
if mod(fila+columna, 2)==1
result(fila, columna)=0;
end
end
end
end
P(#)*+# X6O ?#&: A )8%&: ,-$8%#,'&: cb"""d] )&-&),0&: (# \ 8# -,: ),:*--,: )(A,: fllu A columnu :(0,#
*0.,%

46 ejercicios resueltos Je HATlAB
81
J98%)*)*& UYO 1,$%*Q '8 b,#'8%0&#'8
b,#'8%0&#'8O J:)%*S*% (#, @(#)*+# R(8 %8)*S, )&0& .,%C08$%& (# ;8)$&% v A
(# 8#$8%& n A '8;(8-;, -, 0,$%*Q '8 b,#'8%0&#'8 '8 n )&-(0#,:O J- ;8)$&% v
%8.%8:8#$, -&: ;,-&%8: '8 -, :8/(#', )&-(0#,O
>&% 8980.-&< :* v=[1 2 S 4j A n=S, -, 0,$%*Q '8 b,#'8%0&#'8 $*8#8 -&: ;,-&%8:
'8 v 8# -, :8/(#', )&-(0#,< A n )&-(0#,: 8# $&$,-]
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

Solucion 1.
Antes ue aboiuai la solucion, obseivamos que la piimeia columna es la segunua
con touos sus elementos elevauos a u; la segunua es el vectoi pasauo con touos sus
elementos elevauos a 1; la teiceia columna es la segunua con touos los elementos
elevauos a uos; etcteia. Es uecii, en caua columna colocamos la segunua columna
con sus elementos elevauos al nmeio columna menos 1.
En NATLAB pouemos opeiai con touos los elementos ue un vectoi o ue una matiiz
ue maneia muy comoua. Supongamos que v=[1 2 S 4]. Si queiemos obtenei el
vectoi |1
S
2
S
S
S
4
S
j, hacemos lo siguiente:
>> v

v =

1 2 S 4
>> v.S

ans =

1 S2 24S 1u24
P*/(%, 7\O J# 8- -,'& '8%8)F& &S$8#80&: 8- ;8)$&% v '8 -, *QR(*8%',< )&# $&'&: :(: ;,-&%8: 8-8;,'&: , W
Notese, en la figuia anteiioi, el punto antes uel simbolo ue potencia: el simbolo
punto inuica que la opeiacion afecta a touos los elementos uel vectoi.
Con un sencillo bucle for pouemos iteiai con un vaiiable col uesue 1 hasta n,
aauienuo en caua iteiacion el vectoi v elevauo a col-1:
function result = vandermonde1(v, n)
result=[];

for col=1:n
result(:, col)=v.^(col-1);
end

end
P(#)*+# XWO 1,$%*Q '8 b,#'8%0&#'8 %8--8#,#'& )&-(0#, , )&-(0#,
El iesultauo paia el ejemplo anteiioi es:
Hocorio Polo 0soolo
82
>> v

v =

1 2 S 4

>> vanueimonue1(v, S)

ans =

1 1 1 1 1
1 2 4 8 16
1 S 9 27 81
1 4 16 64 2S6
P*/(%, 7N
Solucion 2.
0tia maneia ue conseguii el mismo iesultauo es iellenai la matiiz poi filas:
estanuo en la fila i, el valoi que coiiesponue a una cieita columna es el valoi i-
simo uel vectoi v, elevauo a la columna ue que se tiate menos 1. Es uecii:
function result = vandermonde2(v, n)
result=[];

for fila=1:length(v)
for col=1:n
result(fila, col)=v(fila)^(col-1);
end
end

end
P(#)*+# X7O 1,$%*Q '8 b,#'8%0&#'8 %8--8#,#'& .&% @*-,:

46 ejercicios resueltos Je HATlAB
8S
J98%)*)*& UZO 1,$%*Q '8 P*S&#,))*
J:)%*S*% (#, @(#)*+# R(8< $&0,#'& )&0& .,%C08$%& (# #T08%& 8#$8%& n,
'8;(8-;, (#, 0,$%*Q '8 '*08#:*+# nkn R(8 )&#$8#/, '8 @&%0, &%'8#,', -&:
n*n .%*08%&: $[%0*#&: '8 -, :8%*8 '8 P*S&#,))*O
>,%, #^V< .&% 8980.-&]
! ! !
! ! !
!" !" !"

Solucion 1.
En una piimeia solucion, iecoiiemos touas las posiciones ue la matiiz con uos
bucles for aniuauos. Poi caua iteiacion vamos inciementanuo un contauoi, que
utilizamos paia calculai el valoi que coiiesponua. Pouemos utilizai cualquieia ue
las funciones ue Fibonacci que implementamos en ejeicicios anteiioies:
function result = matrizFibonacci1(n)
result=[];

contador=1;
for fila=1:n
for col=1:n
result(fila, col)=fib(contador);
contador=contador+1;
end
end
end
P(#)*+# XXO 1,$%*Q '8 P*S&#,))*< ($*-*Q,#'& (#, @(#)*+# ,(=*-*,%
Bos ejemplos uel iesultauo son:
>> matiizFibonacci1(S)

ans =

1 1 2
S S 8
1S 21 S4
>> matiizFibonacci1(S)

ans =

1 1 2 S S
8 1S 21 S4 SS
89 144 2SS S77 61u
987 1S97 2S84 4181 676S
1u946 17711 286S7 46S68 7Su2S
P*/(%, 7U
Solucion 2.
0tia foima ue iesolvei el ejeicicio es ii colocanuo, en caua posicion ue la matiiz, la
suma ue los uos valoies anteiioies. Bacei esto con un vectoi es sencillo (ya lo
iesolvimos en el Ejeicicio 11, pgina S1). Baceilo con una matiiz tiene una
pequea uificultau auicional, ya que hay que tenei en cuenta los finales ue fila.
Hocorio Polo 0soolo
84
En el siguiente couigo, inicializamos piimeio las uos piimeias columnas ue la
piimeia fila; luego, completamos la piimeia fila en el piimei bucle for. A
continuacion, iecoiiemos uesue la fila 2 hasta la n: en las columnas 1 y 2 ue estas
filas tenemos la piecaucion ue leei valoies ue la fila anteiioi; en las iestantes,
leemos los uos valoies inmeuiatamente anteiioies ue la misma columna.
function result = matrizFibonacci2(n)
result=[];
result(1, 1)=1;
result(1, 2)=1;

for col=3:n
result(1, col)=result(1, col-2)+result(1, col-1);
end

for fila=2:n
for col=1:n
if col==1
result(fila, 1)=result(fila-1, n-1)+result(fila-1, n);
elseif col==2
result(fila, 2)=result(fila-1, n)+result(fila, col-1)
else
result(fila, col)=result(fila, col-2)+result(fila, col-1);
end
end
end
end

P(#)*+# XYO 1,$%*Q '8 P*S&#,))*< )&0.($,', 08'*,#$8 -, :(0, '8 -,: '&: .&:*)*&#8: ,#$8%*&%8: c"d
Solucion S.
En una solucion paieciua a la anteiioi, peio algo ms sencilla, eliminamos los uos if
y, en lugai ue comenzai el bucle aniuauo en col=1, lo empezamos en col=S:
function result = matrizFibonacci3(n)
result=[];
result(1, 1)=1;
result(1, 2)=1;

for col=3:n
result(1, col)=result(1, col-2)+result(1, col-1);
end

for fila=2:n
result(fila, 1)=result(fila-1, n-1)+result(fila-1, n);
result(fila, 2)=result(fila-1, n)+result(fila, 1);
for col=3:n
result(fila, col)=result(fila, col-2)+
result(fila, col-1);
end
end
end
P(#)*+# XZO 1,$%*Q '8 P*S&#,))*< )&0.($,', 08'*,#$8 -, :(0, '8 -,: '&: .&:*)*&#8: ,#$8%*&%8: c""d

46 ejercicios resueltos Je HATlAB
8S
J98%)*)*& V\O >%&'()$& '8 0,$%*)8:O
J:)%*S*% (#, @(#)*+# 8# 123425 R(8 ),-)(-8 8- .%&'()$& '8 '&: 0,$%*)8:O
Solucion 1.
NATLAB ya uispone uel opeiauoi * paia multiplicai matiices uiiectamente.
0bviamente, lo que nos piuen es la esciituia ue una funcion que multiplique uos
matiices sin utilizai ese opeiauoi.
veamos como lo hacemos a mano, asumienuo una matiiz A ue nxm y otia B ue mxn:
!
!!
!
!"
! !
!!
!
!"
!
!!
! !
!!
! ! ! !
!
!!
!
!!
! !
!"
!
!
!!
!
!"
! !
!!
!
!"
!
!!
! !
!!
! ! ! !
!
!!
!
!!
! !
!"

Sienuo R la matiiz iesultauo, sus uos piimeias posiciones son:
R11=o11b11-o12*b21-.-o1n*bn1
R12=o11b12-o12*b22-.-o1n*bn2
En geneial, en la posicion Rij va la suma ue los piouuctos ue Hij poi Nji.
Necesitaiemos ties bucles: uno que iecoiia las filas ue H, otio que iecoiia las
columnas ue N y otio ms que se encaigue ue multiplicai los elementos ue la fila y
columna consiueia y ue acumulai el iesultauo paia colocailo en la posicion i, j:
function R = productoDeMatrices(M, N)
columnasM=length(M(1, :));
filasM=length(M(:, 1));

columnasN=length(N(1, :));

R=zeros(filasM, columnasN);

for i=1:filasM
for j=1:columnasN
for k=1:columnasM
R(i, j)=R(i, j)+M(i, k)*N(k, j);
end
end
end
end

P(#)*+# Y\O 1(-$*.-*),)*+# '8 '&: 0,$%*)8:
Pouemos compiobai que la funcion est bien hecha piuinuole a NATLAB que nos
uiga si touos los elementos ue la matiiz R coinciuen con touos los elementos que
NATLAB calcula paia H*N: en la figuia siguiente mostiamos uos matiices H y N;
ms abajo, los iesultauos ue ejecutai nuestia funcion (izquieiua) y ue ejecutai la
funcion ue multiplicacion ue matiices ue NATLAB (H*N); en la fila infeiioi, le
peuimos a NATLAB que compaie los uos iesultauos utilizanuo el opeiauoi ue
Hocorio Polo 0soolo
86
compaiacion (==): el iesultauo (una matiiz ue unos) inuica que ambas matiices
son iguales y que, poi tanto, hemos implementauo bien el couigo ue la funcion.
>> N

N =

1 4 7 1u
2 S 8 11
S 6 9 12

>> N

N =

1 2 S
4 S 6
7 8 9
1u 11 12
>> piouuctoBeNatiices(N, N)

ans =

166 188 21u
188 214 24u
21u 24u 27u

>> N*N

ans =

166 188 21u
188 214 24u
21u 24u 27u
>> piouuctoBeNatiices(N, N)==N*N

ans =

1 1 1
1 1 1
1 1 1
P*/(%, 7V
Solucion 2.
Pouemos mouificai un poco el couigo anteiioi: una vez que tenemos la fila ue H (y
que guaiuamos, poi ejemplo, en un vectoi llamauo filoBeH) y la columna ue N (que
guaiuamos en columnoBeN), pouemos hacei uiiectamente el piouucto ue ambos
vectoies:
function R = productoDeMatrices2(M, N)
filasM=length(M(:, 1));

columnasN=length(N(1, :));

R=zeros(filasM, columnasN);

for i=1:filasM
filaDeM=M(i, :);
for j=1:columnasN
columnaDeN=N(:, j);
R(i, j)=filaDeM*columnaDeN;
end
end
end
P(#)*+# YNO 1(-$*.-*),)*+# '8 0,$%*)8: ,.%&;8)F,#'& 8- .%&'()$& ;8)$&%*,-
46 ejercicios resueltos Je HATlAB
87
J98%)*)*& VNO 3%*C#/(-& '8 3,%$,/-*,
J:)%*S*% (#, @(#)*+# R(8 $&08 (# .,%C08$%& n A )&#:$%(A, (#, 0,$%*Q )&# 8-
$%*C#/(-& '8 3,%$,/-*, '8 '*08#:*+# nO
>&% 8980.-&< .,%, n=4< -, 0,$%*Q R(8 :8 8:.8%, 8:]
N U V 6
N 1 u u u
U 1 1 u u
V 1 2 1 u
6 1 S 2 1
Solucion 1.
En piimei lugai, constiuimos una matiiz ue nxn llena ue ceios. Luego, colocamos 1
en la piimeia columna. Bespus, paia caua columna uesue 2 hasta n, colocamos en
caua casilla el valoi que haya en la fila supeiioi. Poi ejemplo, ubicauos en la
segunua columna y segunua fila (maicaua a continuacion en amaiillo), colocamos
en esa posicion el valoi que tiene encima ms 1.
N U V 6
N 1 u u u
U 1 u u u
V 1 u u u
6 1 u u u
Be este mouo, la matiiz queuai ue la siguiente maneia:
N U V 6
N 1 u u u
U 1 1 u u
V 1 u u u
6 1 u u u
A continuacion, bajamos a la celua iesaltaua a continuacion en amaiillo y, en ella,
colocamos el 1 que tiene encima ms 1:
N U V 6
N 1 u u u
U 1 1 u u
V 1 2 u u
6 1 u u u
Continuamos ue esa maneia hasta llegai a la ltima fila. Luego, pasamos a la
columna S y a la fila S. Pioseguimos ue la misma maneia hasta iecoiiei touas las
columnas:
Hocorio Polo 0soolo
88
function result = tartaglia1( n)
result=zeros(n);

result(:, 1)=ones(n, 1);

for col=2:n
for fila=col:n
result(fila, col)=result(fila-1, col)+1;
end
end
end
P(#)*+# YUO ?#, :&-()*+# .,%, 8- $%*C#/(-& '8 3,%$,/-*,< %8--8#,#'& .&% )&-(0#,:
Solucion 2.
Pouemos paitii tambin ue una matiiz iuentiuau con la piimeia columna a 1. Poi
ejemplo:
N U V 6 W
N 1 u u u u
U 1 1 u u u
V 1 u 1 u u
6 1 u u 1 u
W 1 u u u 1
Paia completai esta matiiz basta con comenzai poi la fila S. Auems, paia
completai caua fila empezaiemos en la columna 2 y llegaiemos hasta la columna
que coinciua con la fila-1: en la fila 4, poi ejemplo, ponemos valoies uesue la
columna 2 hasta la columna S; en la fila S, uesue la 2 hasta la 4.
Con esta iuea, pouemos iellenai exactamente ue la misma maneia que antes:
function result = tartaglia2( n)
result=eye(n);

result(:, 1)=ones(n, 1);

for fila=3:n
for col=2:fila-1
result(fila, col)=result(fila-1, col)+1;
end
end

end
P(#)*+# YVO J- $%*C#/(-& '8 3,%$,/-*,< %8--8#,#'& ,F&%, .&% @*-,:
Solucion S.
Pouemos iellenai la matiiz ue otia maneia. Si nos fijamos, poi ejemplo, en la fila S,
el piimei valoi que uebemos colocai en la columna 2 es el nmeio ue fila-1; el
siguiente, en la columna S, es el nmeio ue fila-2; luego, en la columna 4, el nmeio
ue fila-S: en geneial, colocamos el nmeio ue fila menos el nmeio ue columna
ueciementauo en 1.
46 ejercicios resueltos Je HATlAB
89
N U V 6 W
N 1 u u u u
U 1 1 u u u
V 1
S-(2-1)
1 u u
6 1
4-(2-1) 4-(S-1)
1 u
W 1
S-(2-1) S-(S-1) S-(4-1)
1
En otias palabias:
function result = tartaglia3( n)
result=eye(n);

result(:, 1)=ones(n, 1);

for fila=3:n
for col=2:fila-1
result(fila, col)=fila-(col-1);
end
end

end
P(#)*+# Y6O J- $%*C#/(-& '8 3,%$,/-*,< %8--8#,#'& '8 &$%, 0,#8%,

Hocorio Polo 0soolo
9u
J98%)*)*& VUO 3%*C#/(-& 8R(*-C$8%&
J:)%*S*% (#, @(#)*+# R(8< ','& (# .,%C08$%& n< '8;(8-;, (#, 0,$%*Q @&%0,',
.&% ,:$8%*:)&: R(8 @&%08# (# $%*C#/(-& 8R(*-C$8%&O
>&% 8980.-&< .,%, n=4 A n=S< -,: @*/(%,: :&#]
N U V 6 W 7 X
N
*
U
* * *
V
* * * * *
6
* * * * * * *
N U V 6 W 7 X Y Z
N
*
U
* * *
V
* * * * *
6
* * * * * * *
W
* * * * * * * * *

Solucion 1.
Fijnuonos en las figuias anteiioies, obseivamos que n iepiesenta, poi un lauo, el
nmeio ue filas ue la matiiz; poi otio, el nmeio ue la columna cential; auems, la
matiiz tiene 2n-1 columnas.
Caua fila est foimaua poi un nmeio uecieciente ue espacios en blanco, un
nmeio cieciente ue asteiiscos y, otia vez, un nmeio uecieciente ue espacios en
blanco. Si obseivamos la siguiente figuia, vemos que, en caua fila, hay uos bloques
ue n-filo blancos y, entie ambos bloques, asteiiscos hasta completai la anchuia (si
la anchuia es 2n-1 y hay uos bloques ue n-filo blancos, hay 2{n-filo) blancos), con
lo que el nmeio ue asteiiscos es {2n-1)-2{n-filo).
N U V 6 W 7 X Y Z
N
* n-1 blancos, 1 asteiisco, n-1 blancos
U
* * * n-2 blancos, S asteiiscos, n-2 blancos
V
* * * * * n-S blancos, S asteiiscos, n-S blancos
6
* * * * * * * n-4 blancos, 7 asteiiscos, n-4 blancos
W
* * * * * * * * * n-S blancos, 9 asteiiscos, n-S blancos



Anchuia=2n-1
Es uecii, que caua fila la constiuimos esciibienuo n-filo blancos uesue la columna 1.
Luego, esciibimos asteiiscos uesue la columna siguiente (n-filo-1) hasta la
columna n-filo-1-{2n-1)-2{n-filo)-1. Finalmente, esciibimos blancos.
Tenemos muchas foimas ue solucionai el ejeicicio. Lo que haiemos en piimei
lugai sei constiuii una matiiz ue nx{2n-1) asteiiscos y, luego, ponei los blancos
que coiiesponuan en caua fila:
46 ejercicios resueltos Je HATlAB
91
function result = trianguloEquilatero1(n)
result=char(n, 2*n-1);

for fila=1:n
for col=1:2*n-1
result(fila, col)='*';
end
end

for fila=1:n
for col=1:n-fila
result(fila, col)=' ';
end

for col=n-fila+1+(2*n-1)-2*(n-fila):2*n-1
result(fila, col)=' ';
end
end
end
P(#)*+# YWO J- $%*C#/(-& 8R(*-C$8%&< :(:$*$(A8#'& ,:$8%*:)&: .&% 8:.,)*&: 8# S-,#)&O
Bagamos una tiaza paicial paia n=4:
D&08#$,%*&: @*-, )&- #E@*-, #E@*-,`N`cUl#ENdE
Ulc#E@*-,d
%8:(-$
Bimensionamos el
iesultauo como una
matiiz ue nx{2n-1)
caiacteies y la
iellenamos ue
asteiiscos en el
piimei for
1 2 S 4 S 6 7
1
* * * * * * *
2
* * * * * * *
S
* * * * * * *
4
* * * * * * *
Entiamos en el bucle
iesaltauo en amaiillo
en la Funcion 8S
1 1 S 1 2 S 4 S 6 7
1
* * * * * *
2
* * * * * * *
S
* * * * * * *
4
* * * * * * *
1 2 S 1 2 S 4 S 6 7
1
* * * * *
2
* * * * * * *
S
* * * * * * *
4
* * * * * * *
1 S S 1 2 S 4 S 6 7
1
* * * *
2
* * * * * * *
S
* * * * * * *
4
* * * * * * *
Hocorio Polo 0soolo
92
D&08#$,%*&: @*-, )&- #E@*-, #E@*-,`N`cUl#ENdE
Ulc#E@*-,d
%8:(-$
Llegamos al bucle
veiue
1 S 4-1+1+(2*4-1)-2*(4-
1)=S
1 2 S 4 S 6 7
1
* * *
2
* * * * * * *
S
* * * * * * *
4
* * * * * * *


1 6 S 1 2 S 4 S 6 7
1
* *
2
* * * * * * *
S
* * * * * * *
4
* * * * * * *


1 7 S 1 2 S 4 S 6 7
1
*
2
* * * * * * *
S
* * * * * * *
4
* * * * * * *


Bemos iecoiiiuo los
bucles amaiillo y
veiue paia filo=1. Se
inciementa filo paia
piocesai la fila 2.
Entiamos ue nuevo
en el bucle amaiillo
2 1 2 1 2 S 4 S 6 7
1
*
2
* * * * * *
S
* * * * * * *
4
* * * * * * *
2 2 2 1 2 S 4 S 6 7
1
*
2
* * * * *
S
* * * * * * *
4
* * * * * * *
Y se continuo Je esto monero con toJos los filos
P*/(%, 76O 3%,Q, .,%)*,- '8 -, P(#)*+# YW
Solucion 2.
En otia posible solucion, paitimos ue una matiiz ue blancos y colocamos asteiiscos
en las posiciones que coiiesponuan:
46 ejercicios resueltos Je HATlAB
9S
function result = trianguloEquilatero2(n)
result=char(n, 2*n-1);

for fila=1:n
for col=n-fila+1:n-fila+1+(2*n-1)-2*(n-fila)-1
result(fila, col)='*';
end
end
end
P(#)*+# Y7O J- $%*C#/(-& 8R(*-C$8%&< )&-&),#'& ,:$8%*:)&: .&% @*-,:
Solucion S.
Pouemos analizai el pioblema poi columnas en lugai ue poi filas. Paia n=S,
obseivamos que en la columna 1 hay 1 asteiisco abajo uel touo; en la 2, 2
asteiiscos abajo uel touo; llegamos asi hasta la columna S, en la que hay S
asteiiscos. En la 6 hay 4; en la 7, S; en la 8, 2; y en la 9, 1.
N U V 6 W 7 X Y Z
N
*
U
* * *
V
* * * * *
6
* * * * * * *
W
* * * * * * * * *
En la siguiente funcion, constiuimos la matiiz ue caiacteies y, con objeto ue
apieciai mejoi el iesultauo, la iellenamos con guiones en lugai ue con blancos. A
continuacion, en el bucle amaiillo, constiuimos una vaiiable bilero que usaiemos
paia almacenai el conteniuo ue caua columna. A continuacion, iecoiiemos la
matiiz uesue las columnas 1 a n y colocamos en bilero los asteiiscos que hagan
falta paia la columna que coiiesponua (bucle veiue). Poi ltimo, colocamos la
bilero iecin foimaua en la columna izquieiua (col) y en su simtiica ueiecha (2*n-
col):
Hocorio Polo 0soolo
94
function result = trianguloEquilatero3(n)
result=char(n, 2*n-1);

for fila=1:n
for col=1:2*n-1
result(fila, col)='-';
end
end

hilera=char(n);
for fila=1:n
hilera(fila)='-';
end

for col=1:n
for fila=n:-1:n-col+1
hilera(fila)='*';
end

result(:, col)=hilera;
result(:, 2*n-col)=hilera;
end
end
P(#)*+# YXO J- $%*C#/(-& 8R(*-C$8%&< )&-&),#'& ,:$8%*:)&: .&% )&-(0#,:
Bos iesultauos ue ejemplo son los siguientes:
>> tiianguloEquilateioS(S)

ans =

----*----
---***---
--*****--
-*******-
*********
>> tiianguloEquilateioS(1u)

ans =

---------*---------
--------***--------
-------*****-------
------*******------
-----*********-----
----***********----
---*************---
--***************--
-*****************-
*******************
P*/(%, 7W

46 ejercicios resueltos Je HATlAB
9S
J98%)*)*& VVO 1,$%*Q $%*,#/(-,% :(.8%*&%
J:)%*S*% (#, @(#)*+# $&08 )&0& .,%C08$%& (# #T08%& n A '8;(8-;, (#,
0,$%*Q '8 nxn, $%*,#/(-,% :(.8%*&%< )&# -, :*/(*8#$8 @&%0,]
! ! ! ! !
! ! ! ! ! !!
! ! ! ! ! !!
! ! ! ! !
! ! ! ! !
! ! ! ! !

Solucion 1.
Pouemos paitii ue una matiiz iuentiuau. Luego, en caua fila, iecoiiemos uesue la
columna filo-1 hasta la columna n, colocanuo en caua casilla el nmeio que tenga a
la izquieiua inciementauo en 1:
function result = triangularSuperior1(n)
result=eye(n);

for fila=1:n
for col=fila+1:n
result(fila, col)=result(fila, col-1)+1;
end
end
end
P(#)*+# YYO 1,$%*Q $%*,#/(-,% :(.8%*&%< %8--8#,#'& .&% @*-,: A 80.8Q,#'& )&# (#, 0,$%*Q *'8#$*','
Y el iesultauo es:

>> tiiangulaiSupeiioi1(S)

ans =

1 2 S 4 S
u 1 2 S 4
u u 1 2 S
u u u 1 2
u u u u 1
P*/(%, 77
Solucion 2.
Tambin pouemos paitii ue una matiiz ue ceios y iellenai caua fila ue foima
paieciua: en caua filo, empezaiemos en la columna filo uesue 1 hasta n. El couigo,
en piincipio, pouiia sei el siguiente:
Hocorio Polo 0soolo
96
function result = triangularSuperior2(n)
result=zeros(n);

for fila=1:n
for col=fila:n
result(fila, col)=result(fila, col-1)+1;
end
end
end
P(#)*+# YZO B&-()*+# *#)&%%8)$, .,%, -, 0,$%*Q $%*,#/(-,% :(.8%*&%
Al ejecutai la Funcion 89, sin embaigo, encontiamos un eiioi:
>> tiiangulaiSupeiioi2(S)
... Attempteu to access iesult(1,u); inuex must be a positive integei oi logical.

Eiioi in ==> tiiangulaiSupeiioi2 at 7
iesult(fila, col)=iesult(fila, col-1)+1;
P*/(%, 7XO 18#:,98 '8 8%%&% &S$8#*'& ,- 898)($,% -, P(#)*+# YZ
El eiioi se piouuce la piimeia vez que se intenta acceuei al elemento result{filo,
col-1): en este momento, col=1 y, claiamente, col-1=0, con lo que el elemento que
tiatamos ue iecupeiai es result{1, 0), que est fueia ue los limites ue la matiiz.
0na foima ue aiieglai el pioblema es iellenai ue maneia sepaiaua la piimeia fila y,
luego, continuai uesue la fila 2 hasta la n:
function result = triangularSuperior2(n)
result=zeros(n);

for col=1:n
result(1, col)=col;
end

for fila=2:n
for col=fila:n
result(fila, col)=result(fila, col-1)+1;
end
end
end
P(#)*+# Z\O 4, @(#)*+# ,#$8%*&%< ,F&%, :*# 8- 8%%&%
Solucion S.
Tambin pouemos iellenai poi columnas: paitienuo ue una matiiz ue ceios, el
piimei volor ue caua columna es el piopio nmeio ue columna. Paia completai la
columna, vamos ueciementanuo el volor hasta llegai a u. Es uecii:
46 ejercicios resueltos Je HATlAB
97
function result = triangularSuperior3(n)
result=zeros(n);

for col=1:n
valor=col;
for fila=1:col
result(fila, col)=valor;
valor=valor-1;
end
end
end
P(#)*+# ZNO 1,$%*Q $%*,#/(-,% :(.8%*&%< %8--8#,#'& .&% )&-(0#,:
Solucion 4.
En una foima ms ue solucionailo, completamos piimeio la piimeia fila y luego
iecoiiemos touas las columnas uesue la fila 2. En caua posicion, colocamos el valoi
que haya encima menos 1:
function result = triangularSuperior4(n)
result=zeros(n);

for col=1:n
result(1, col)=col;
end

for col=1:n
for fila=2:col
result(fila, col)=result(fila-1, col)-1;
end
end
end
P(#)*+# ZUO 1,$%*Q $%*,#/(-,% :(.8%*&%< %8--8#,#'& .&% )&-(0#,: $%,: %8--8#,% ,#$8: -, .%*08%, @*-,
Solucion S.
uiz la solucion ms sencilla sea la siguiente: si nos fijamos, el valoi que apaiece
en caua casilla uel tiingulo supeiioi es la uifeiencia entie el nmeio ue columna y
el nmeio ue fila ms 1:
N U V 6 W
N 2-1+1
U 4-2+1
V S-S+1
6
W
Poi tanto:
Hocorio Polo 0soolo
98
function r=triangularSuperior5(n)
r=[];
for fila=1:n
for col=fila:n
r(fila, col)=col-fila+1;
end
end
end
P(#)*+# ZVO ?#, :&-()*+# :8#)*--, .,%, -, 1,$%*Q $%*,#/(-,% :(.8%*&%

46 ejercicios resueltos Je HATlAB
99
J98%)*)*& V6O I*,/&#,-8: R(8 :8 *#)%808#$,# c"d
J:)%*S*% (#, @(#)*+# R(8 )&#:$%(A, (#, 0,$%*Q '8 nxn )(A, '*,/&#,-
.%*#)*.,- 8:$[ @&%0,', .&% (#&:< A 8- %8:$& '8 '*,/&#,-8: 8:$C# @&%0,',: .&%
:( '*:$,#)*, , -, '*,/&#,- .%*#)*.,-O
>&% 8980.-&< .,%, n=S:
! ! ! ! !
! ! ! ! !
! ! ! ! !
! ! ! ! !
! ! ! ! !

Solucion 1.
Este ejeicicio es una geneializacion uel anteiioi: ahoia se tiata ue iellenai no solo
el tiingulo supeiioi, sino tambin el infeiioi. Paitienuo ue la ltima solucion uaua
al ejeicicio ue la matiiz tiiangulai supeiioi, el valoi que uebemos colocai en caua
casilla es obs{col-filo)-1:
function r=diagonalesQueSeIncrementan1(n)
r=[];
for fila=1:n
for col=1:n
r(fila, col)=abs(col-fila)+1;
end
end
end
P(#)*+# Z6
Solucion 2.
Pouemos haceilo tambin ms complicauo: en la piimeia columna, colocamos los
nmeios uesue 1 empezanuo en la fila 1 y teiminanuo en la fila n; en la segunua,
colocamos los nmeios uesue 1 empezanuo en la fila 2 (el mismo nmeio que la
columna) y lleganuo hasta la fila n. Be esta maneia completamos el tiingulo
infeiioi:
function r=triangularInferior1(n)
r=[];

for col=1:n
valor=1;
for fila=col:n
r(fila, col)=valor;
valor=valor+1;
end
end
end
P(#)*+# ZWO P%,/08#$& '8 )+'*/& .,%, %8--8#,% .&% )&-(0#,: 8- $%*C#/(-& *#@8%*&%
Efectivamente, si ejecutamos obtenemos el siguiente iesultauo:
Hocorio Polo 0soolo
1uu
>> uiagonalesueSeInciementan2(8)

ans =

1 u u u u u u u
2 1 u u u u u u
S 2 1 u u u u u
4 S 2 1 u u u u
S 4 S 2 1 u u u
6 S 4 S 2 1 u u
7 6 S 4 S 2 1 u
8 7 6 S 4 S 2 1
P*/(%, 7YO 2- 898)($,% 8- )+'*/& '8 -, P(#)*+# ZW< &S$8#80&: 8- $%*C#/(-& *#@8%*&%
Paia completai el iesto, nos pouemos fijai en algunas ue las soluciones uauas al
Ejeicicio SS y completai el couigo:
function r=diagonalesQueSeIncrementan2(n)
r=[];

for col=1:n
valor=1;
for fila=col:n
r(fila, col)=valor;
valor=valor+1;
end
end

for fila=1:n
for col=fila+1:n
r(fila, col)=r(fila, col-1)+1;
end
end
end
P(#)*+# Z7O 4, P(#)*+# ZW< )&0.-8$,', .,%, R(8 :8 %8--8#8 8- $%*C#/(-& :(.8%*&%
Solucion S.
Bel ejeicicio anteiioi tenemos vaiias funciones paia constiuii la matiiz tiiangulai
supeiioi, y con la Funcion 9S constiuimos la tiiangulai infeiioi. Pouemos
combinai los iesultauos ue ambas funciones en una sola matiiz: lo que haiemos
sei tomai, ue caua matiiz, el mximo valoi ue la misma posicion:
3%*,#/(-,% :(.8%*&% 3%*,#/(-,% *#@8%*&%
N U V 6 W N u u u u
u N U V 6 U N u u u
u u N U V V U N u u
u u u N U 6 V U N u
u u u u N W 6 V U N
Esto es lo que hacemos en la funcion siguiente meuiante la funcion mox ue
NATLAB:
46 ejercicios resueltos Je HATlAB
1u1
function r=diagonalesQueSeIncrementan3(n)
r=max(triangularInferior1(n), triangularSuperior1(n));
end
P(#)*+# ZXO D&#:$%())*+# '8 -, 0,$%*Q .8'*', , .,%$*% '8 -,: '&: $%*,#/(-,%8:

Hocorio Polo 0soolo
1u2
J98%)*)*& VWO I*,/&#,-8: R(8 :8 *#)%808#$,# c""d
J:)%*S*% (#, @(#)*+# R(8 )&#:$%(A, (#, 0,$%*Q '8 nxn )(A, '*,/&#,-
.%*#)*.,- 8:$[ @&%0,', .&% -&: ;,-&%8: .,:,'&: 8# (# .,%C08$%& m< A 8- %8:$&
'8 '*,/&#,-8: 8:$C# @&%0,',: .&% :( '*:$,#)*, , -, '*,/&#,- .%*#)*.,- 0C: mO
>&% 8980.-&< .,%, n=S A m=6:
! ! ! ! !"
! ! ! ! !
! ! ! ! !
! ! ! ! !
!" ! ! ! !

Solucion 1.
Paitienuo ue cualquieia ue las soluciones uauas al ejeicicio anteiioi, lo nico que
tenemos que hacei es iecoiiei la matiiz obteniua y sumai, a caua casilla, el valoi
ue m-1. Poi ejemplo, paia n=S y m=6:
1 2 S 4 S
1+6-1 2+6-1 S+6-1 4+6-1 S+6-1
2 1 2 S 4
2+6-1 1+6-1 2+6-1 S+6-1 4+6-1
S 2 1 2 S
S+6-1 2+6-1 1+6-1 2+6-1 S+6-1
4 S 2 1 2
4+6-1 S+6-1 2+6-1 1+6-1 2+6-1
S 4 S 2 1
S+6-1 4+6-1 S+6-1 2+6-1 1+6-1
0na posible solucion, en la que llamamos a la Funcion 94 (pgina 99), es:
function r=diagonalesQueSeIncrementanB1(n, m)
r=diagonalesQueSeIncrementan1(n);

for fila=1:n
for col=1:n
r(fila, col)=r(fila, col)+m-1;
end
end
end
P(#)*+# ZY

46 ejercicios resueltos Je HATlAB
1uS
J98%)*)*& V7O HT08%&: &%'8#,'&:
J:)%*S*% (#, @(#)*+# R(8 $&08 (# ,%/(08#$& n A '8;(8-;, (#, 0,$%*Q '8 nxn
)&# $&'&: -&: #T08%&: '8:'8 N F,:$, n
2
.
>&% 8980.-&< .,%, n=4]
N U V 6
N 1 2 S 4
U S 6 7 8
V 9 1u 11 12
6 1S 14 1S 16
Solucion 1.
Con lo que ya sabemos, este ejeicicio es picticamente tiivial. Poi ejemplo,
pouemos iecoiiei touas las casillas con uos bucles aniuauos (uno paia las filas y
otio paia las columnas), colocanuo en caua una un volor que vamos
inciementanuo en caua iteiacion:
function r = numerosOrdenados1(n)
r=zeros(n);

valor=1;
for fila=1:n
for col=1:n
r(fila, col)=valor;
valor=valor+1;
end
end
end
P(#)*+# ZZ
Solucion 2.
0tia solucion algo ms enievesaua es la siguiente: si nos fijamos, el piimei nmeio
ue caua columna es su nmeio ue columna. Luego, hacia abajo, van inciementanuo
ue n en n:
N U V 6
N 1 2 S 4
U 1+4 2+4 S+4 4+4
V
6
Esto es lo que hacemos en la solucion siguiente: piimeio, llenamos en un bucle
apaite la piimeia fila; luego, continuamos iecoiiienuo caua columna a paitii ue la
segunua fila, ponienuo en caua posicion el valoi que tenga encima inciementauo
en n:
Hocorio Polo 0soolo
1u4
function r = numerosOrdenados2(n)
r=zeros(n);

for col=1:n
r(1, col)=col;
end

for col=1:n
for fila=2:n
r(fila, col)=r(fila-1, col)+n;
end
end
end
P(#)*+# N\\

46 ejercicios resueltos Je HATlAB
1uS
J98%)*)*& VXO HT08%&: &%'8#,'&: '8:)8#'8#$808#$8
J:)%*S*% (#, @(#)*+# R(8 $&08 (# ,%/(08#$& n A '8;(8-;, (#, 0,$%*Q '8 nxn
)&# $&'&: -&: #T08%&: '8:'8 N F,:$, n
2
, &%'8#,'&: '8 0,A&% , 08#&%O
>&% 8980.-&< .,%, n=4]
N U V 6
N 16 1S 14 1S
U 12 11 1u 9
V 8 7 6 S
6 4 S 2 1
Solucion 1.
Reesciibiiemos la piimeia solucion uaua al ejeicicio anteiioi. Ahoia, el valoi poi el
que aiiancamos sei n
2
y lo iiemos ueciementanuo en caua iteiacion:
function r = numerosOrdenadosDescendentemente1(n)
r=zeros(n);

valor=n^2;
for fila=1:n
for col=1:n
r(fila, col)=valor;
valor=valor-1;
end
end
end
P(#)*+# N\N
Solucion 2.
0tia foima ue haceilo, paieciua a la solucion 2 uel ejeicicio anteiioi, es iellenai
poi columnas: piimeio completamos la ltima fila en un bucle apaite; luego, en
caua columna, vamos uesue la penltima fila hasta la piimeia, colocanuo en caua
posicion el valoi que tiene uebajo ms n:
function r = numerosOrdenadosDescendentemente2(n)
r=zeros(n);

for col=1:n
r(n, col)=n-col+1;
end

for col=1:n
for fila=n-1:-1:1
r(fila, col)=r(fila+1, col)+n;
end
end
end
P(#)*+# N\U

Hocorio Polo 0soolo
1u6
J98%)*)*& VYO m*/Q,/
J:)%*S*% (#, @(#)*+# 8# 123425 R(8 '8;(8-;, (#, 0,$%*Q '8 nxn )&# -&:
#T08%& '8:'8 8- N F,:$, n
2
)&-&),'&: 8# -,: @*-,: 8# Q*/Q,/O
>&% 8980.-&< .,%, n=4]
N U V 6
N 1 2 S 4
U 8 7 6 S
V 9 1u 11 12
6 16 1S 14 1S
Solucion 1.
Si nos fijamos en la matiiz ue ejemplo, los valoies en las filas impaies son
ciecientes, y ueciecientes en las paies. Pouemos ii iecoiiienuo la matiiz poi filas:
si la fila es impai, iecoiiemos sus casillas uesue la columna 1 hasta la n; si es pai,
iecoiiemos uesue la n hasta la 1. En caua casilla, colocamos un valoi que
inicializamos a 1 y que vamos inciementanuo en caua iteiacion.
function r = zigzag(n)
r=zeros(n);

valor=1;
for fila=1:n
if mod(fila, 2)==1
for col=1:n
r(fila, col)=valor;
valor=valor+1;
end
else
for col=n:-1:1
r(fila, col)=valor;
valor=valor+1;
end
end
end
end
P(#)*+# N\V

46 ejercicios resueltos Je HATlAB
1u7
J98%)*)*& VZO I*:$,#)*,:
J:)%*S*% (#, @(#)*+# R(8 )&#:$%(A, (#, 0,$%*Q '8 nxn, )&# n *0.,%< 8# -, R(8
),', 8-808#$& 8: (# #T08%& R(8 %8.%8:8#$, -, '*:$,#)*, ,- 8-808#$& )8#$%,-
'8 -, 0,$%*QO 4, '*:$,#)*, 8: -, :(0, '8 -,: '*:$,#)*,: 8# @*-,: A )&-(0#,:O
>&% 8980.-&< .,%, n=S:
N U V 6 W
N 4 S 2 S 4
U S 2 1 2 S
V 2 1 u 1 2
6 S 2 1 2 S
W 4 S 2 S 4
Solucion 1.
El ejeicicio es muy sencillito: conocienuo la fila y columna mitoJ (que es {n-1),2),
iecoiieiemos touas las casillas colocanuo, como valoi, la suma ue su columna
menos la mitau ms la fila menos la mitau, ambas en valoi absoluto:
function r = distancias1(n)
r=zeros(n);
mitad=(n+1)/2;

for fila=1:n
for col=1:n
r(fila, col)=abs(fila-mitad)+abs(col-mitad);
end
end
end
P(#)*+# N\6
Y al ejecutai la funcion, obtenemos:
>> uistancias1(S)

ans =

4 S 2 S 4
S 2 1 2 S
2 1 u 1 2
S 2 1 2 S
4 S 2 S 4
P*/(%, 7Z
Solucion 2.
Pouemos iesolveilo ue otia maneia: paitienuo ue la columna cential ya iellena,
pouemos moveinos poi las ue la izquieiua (uesue la mitoJ-1 hasta 1) y las ue la
ueiecha (uesue mitoJ-1 hasta n): en las ue la izquieiua, colocamos el valoi que
Hocorio Polo 0soolo
1u8
tengan a la ueiecha ms 1. Luego, en las ue la ueiecha, colocamos el valoi que
tengan a la izquieiua ms 1:
N U V 6 W
N 2+1 2 2+1
U 1+1 1 1+1
V u+1 u u+1
6 1+1 1 1+1
W 2+1 2 2+1
La piimeia columna la pouemos completai en uos paites: paia la paite supeiioi
iiemos uesue 1 hasta mitoJ-1, colocanuo valoies uesue mitoJ-1 hasta 1 (bajanuo
ue 1 en 1); paia la paite infeiioi, iecoiiemos uesue mitoJ-1 hasta n, colocanuo
valoies uesue 1 hasta llegai a la fila n.
Con el siguiente fiagmento ue couigo iellenamos la columna cential:
function r = distancias2(n)
r=zeros(n);
mitad=(n+1)/2;

for fila=1:mitad-1
r(fila, mitad)=mitad-fila;
end

for fila=mitad+1:n
r(fila, mitad)=fila-mitad;
end
end
P(#)*+# N\WO L8--8#,0&: -, )&-(0#, )8#$%,- 08'*,#$8 '&: S()-8:
En efecto, el iesultauo paia n=S es:
>> uistancias2(S)

ans =

u u 2 u u
u u 1 u u
u u u u u
u u 1 u u
u u 2 u u
P*/(%, X\
Paia completai la mitau izquieiua aauimos un poco ue couigo:
46 ejercicios resueltos Je HATlAB
1u9
function r = distancias2(n)
r=zeros(n);
mitad=(n+1)/2;

for fila=1:mitad-1
r(fila, mitad)=mitad-fila;
end

for fila=mitad+1:n
r(fila, mitad)=fila-mitad;
end

for col=mitad-1:-1:1
for fila=1:n
r(fila, col)=r(fila, col+1)+1;
end
end
end
P(#)*+# N\7O D&0.-8$,0&: 8- )+'*/& '8 -, Eiioi! No se encuentia el oiigen ue la iefeiencia. .,%,
)&0.-8$,% -, 0*$,' *QR(*8%',
El iesultauo, ue momento, es el siguiente:
>> uistancias2(S)

ans =

4 S 2 u u
S 2 1 u u
2 1 u u u
4 S 2 u u
S 2 1 u u
P*/(%, XN
Y, ya poi ltimo, completamos con otio bucle paia iellenai la mitau ueiecha:
Hocorio Polo 0soolo
11u
function r = distancias2(n)
r=zeros(n);
mitad=(n+1)/2;

for fila=1:mitad-1
r(fila, mitad)=mitad-fila;
end

for fila=mitad+1:n
r(fila, mitad)=fila-mitad;
end

for col=mitad-1:-1:1
for fila=1:n
r(fila, col)=r(fila, col+1)+1;
end
end

for col=mitad+1:n
for fila=1:n
r(fila, col)=r(fila, col-1)+1;
end
end
end
P(#)*+# N\X

46 ejercicios resueltos Je HATlAB
111
J98%)*)*& 6\O I*:$,#)*, 8# -8$%,:
J:)%*S*% (#, @(#)*+# R(8 )&#:$%(A, (#, 0,$%*Q '8 nxn, )&# n *0.,%< 8# -, R(8
),', 8-808#$& 8: (#, -8$%, R(8 %8.%8:8#$, -, '*:$,#)*, ,- 8-808#$& )8#$%,-
'8 -, 0,$%*QO 4, '*:$,#)*, 8: -, :(0, '8 -,: '*:$,#)*,: 8# @*-,: A )&-(0#,:O J-
)8%& :8 )&%%8:.&#'8 )&# -, -8$%, u< 8- N )&# -, b< 8$)[$8%,O
>&% 8980.-&< .,%, n=S:
N U V 6 W
N e u c u e
U u c b c u
V c b a b c
6 u c b c u
W e u c u e
Solucion 1.
Paia planteai la solucion, uebemos sabei piimeio que caua caictei ue los que
manipula NATLAB tiene un nmeio enteio asociauo (lo que se llama el cJiqo
ASCll). Asi, poi ejemplo, las letias maysculas empiezan en el 6S (la A) y teiminan
en el 9u (la Z). Las minsculas empiezan en la 97. El siguiente piogiama muestia
los caiacteies que coiiesponuen a caua valoi numiico:
function caracteres()
for i=1:255
linea=[int2str(i), '-> ', char(i)];
disp(linea);
end
end
P(#)*+# N\YO >%&/%,0, .,%, :,),% -, -*:$, '8 )+'*/&: 2BD""
En el couigo ue aiiiba hemos iesaltauo la funcion cbor{i), que uevuelve el caictei
coiiesponuiente al valoi que se pasa como paimetio: asi, poi ejemplo, cbor{6S)
es 'A, y cbor{97)=o.
Paia esciibii el couigo que solucione este ejeicicio pioceueiemos ue foima muy
paieciua al ejeicicio anteiioi: ahoia, sin embaigo, en lugai ue colocai nmeios
queiemos colocai letias. El couigo ue la funcion es muy paieciuo al ue la Funcion
1u4 (pgina 1u7): la uistancia ue caua casilla al centio la guaiuamos en la vaiiable
Jistoncio; luego, el valoi que colocamos es el couigo ASCII coiiesponuiente a esa
Jistoncio peio, como uebemos empezai poi la letia 'a paia iepiesentai el ceio, le
sumamos 97 (ya que cbor{97-0)=cbor{97)=o).
Hocorio Polo 0soolo
112
function r = distanciaEnLetras1(n)
r=char(n);
mitad=(n+1)/2;

for fila=1:n
for col=1:n
distancia=abs(fila-mitad)+abs(col-mitad);
r(fila, col)=char(97+distancia);
end
end
end
P(#)*+# N\Z

46 ejercicios resueltos Je HATlAB
11S
J98%)*)*& 6NO 5(:),'&% '8 ),'8#,:
J:)%*S*% (#, @(#)*+# 8# 123425 R(8 S(:R(8< 8# -, ),'8#, R(8 :8 .,:, )&0&
.%*08% .,%C08$%&< -, ),'8#, R(8 :8 .,:, )&0& :8/(#'&O 4, &.8%,)*+# '8S8
'8;&-;8% (# EN :* #& -, 8#)(8#$%,< & -, .&:*)*+# 8# -, R(8 ,.,%8)8O
>&% 8980.-&] encontrur(Problemux Je MA1IAB, MA1IAB) '8S8 '8;&-;8% N6O
Solucion 1.
NATLAB tiata las cauenas ue caiacteies como vectoies. Paia el ejemplo anteiioi,
se tiata ue buscai un subvectoi uentio ue un vectoi.
N U V 6 W 7 X Y Z N\ NN NU NV N6 NW N7 NX NY NZ
P i o b l e m a s u e N A T L A B

Si el pation que buscamos ('NATLAB, en el ejemplo) tiene 6 caiacteies, el
pioblema se ieuuce a extiaei subvectoies ue 6 caiacteies ue la cauena gianue
empezanuo en la posicion 1. Si lo encontiamos en esa posicion, uevolvemos un 1;
si no, avanzamos hasta la 2. Continuamos asi hasta que lo encontiemos o hasta que
lleguemos a una posicion uesue la que no pouamos leei 6 caiacteies (es uecii, la
1S).
El ejeicicio pouemos iesolveilo ue la siguiente foima: en posicionIinol guaiuamos
la posicion uel ltimo caictei a paitii uel cual no pouemos seguii buscanuo (14,
en el ejemplo); luego, entiamos a un wbile en el que peimaneceiemos hasta
encontiai el pation o hasta que, sin encontiailo, lleguemos a la posicionIinol.
Bentio uel bucle, vamos extiayenuo subcauenas, uesue la posicion i, ue la misma
longituu que el pation, y las compaiamos con el potron. La compaiacion la
hacemos con la funcion strcmp ue NATLAB, que uevuelve 1 si las uos cauenas que
se pasan como paimetios son iguales y u en caso contiaiio.
function r = encontrar1(texto, patron)
r=-1;

i=1;
posicionFinal=length(texto)-length(patron)+1;

while (r==-1 && i<=posicionFinal)
subcadena=texto(1, i:i+length(patron)-1);
if strcmp(subcadena, patron)==1
r=i;
end
i=i+1;
end
end
P(#)*+# NN\O 5T:R(8', '8 (# .,$%+# 8# (#, ),'8#,
0na posible tiaza con el ejemplo anteiioi es:
Hocorio Polo 0soolo
114
D&08#$,%*& % * .&:P*#,- .,$%&# :(S),'8#,
Antes uel wbile -1 1 14 NATLAB
Entiamos al wbile -1 1 14 NATLAB Pioble
-1 2 14 NATLAB ioblem
-1 S 14 NATLAB oblema
-1 4 14 NATLAB blemas
Con uenotamos el
espacio en blanco
-1 S 14 NATLAB lemas-
-1 6 14 NATLAB emas-u
-1 7 14 NATLAB mas-ue
-1 8 14 NATLAB as-ue-
-1 9 14 NATLAB s-ue-N
-1 1u 14 NATLAB -ue-NA
-1 11 14 NATLAB ue-NAT
-1 12 14 NATLAB e-NATL
-1 1S 14 NATLAB -NATLA
strcmp uevuelve 1,
pues potron es
igual a subcoJeno
14 14 14 NATLAB NATLAB
P*/(%, XUO 3%,Q, '8 -, P(#)*+# NN\

46 ejercicios resueltos Je HATlAB
11S
J98%)*)*& 6UO I8$8))*+# '8 .,-h#'%&0&:
J:)%*S*% (#, @(#)*+# R(8< $&0,#'& (#, ),'8#, '8 ),%,)$8%8: )&0&
.,%C08$%&< '8;(8-;, (# N :* -, ),'8#, 8: (# .,-h#'%&0&< A \ 8# ),:&
)&#$%,%*&< :*# )&#:*'8%,% -&: 8:.,)*&: 8# S-,#)&O
Solucion 1.
Consiueiemos el palinuiomo ue siete caiacteies onilino:
N U V 6 W 7 X
a n i l i n a
La palabia es palinuiomo poique el caictei 1 es igual al 7, el 2 igual al 6 y el S
igual al S. El caictei 4 no hace falta compaiailo poique el nmeio ue caiacteies
ue la palabia es impai y la ele queua en meuio.
Paia un palinuiomo con un nmeio pai ue letias, como erre, no hay caictei en el
centio. El caictei 1 es igual al 4 y el 2 es igual al S.
N U V 6
e i i e
Lo piimeio que haiemos sei quitai touos los espacios en blanco a la iistia ue
caiacteies que le llegue a la funcion. Recoiieiemos la iistia oiiginal ue piincipio a
fin: si el caictei i-simo no es un espacio, lo aauimos a la iistia mouificaua; si si
lo es, pasamos al siguiente caictei sin aauiilo:
oiiginal
N U V 6 W 7 X Y Z N\ NN NU NV N6 NW N7 NX NY NZ
P i o b l e m a s u e N A T L A B

sin
espacios
N U V 6 W 7 X Y Z N\ NN NU NV N6 NW N7 NX
P i o b l e m a s u e N A T L A B

El siguiente tiozo ue couigo iealiza la funcion uesciita: ciea la vaiiable ouxilior
como un vectoi ue caiacteies; luego, iecoiie el texto oiiginal y, si el caictei no es
una espacio, lo aaue a ouxilior.
function r = palindromo1(texto)
auxiliar=char();

pos=1;
for i=1:length(texto)
if (~isspace(texto(i)))
auxiliar(pos)=texto(i);
pos=pos+1;
end
end

auxiliar
end
P(#)*+# NNNO >%*08%& 8-*0*#,0&: -&: 8:.,)*&: 8# S-,#)&
Hocorio Polo 0soolo
116
La linea iesaltaua en amaiillo en el couigo anteiioi, en la que apaiece la palabia
"auxiliai" sin punto y coma al final, siive paia que NATLAB muestie poi la consola
el valoi ue esa vaiiable:
>> texto

texto =

Pioblemas ue NATLAB

>> palinuiomo1(texto)

auxiliai =

PioblemasueNATLAB
P*/(%, XVO J-*0*#,0&: -&: 8:.,)*&: '8- $8=$& n>%&S-80,: '8 123425o
0na vez piepiocesaua la cauena, iecoiieiemos la piimeia mitau ue la palabia e
iiemos compaianuo sus caiacteies con los ue la segunua mitau. Paia una palabia
ue longituu pai, la piimeia mitau va uesue 1 hasta la longituu entie 2; paia una ue
longituu impai, uesue 1 hasta la paite enteia ue la mitau ue la longituu: entonces,
antes ue compiobai si la cauena ue caiacteies es o no un palinuiomo,
calculaiemos la posicion ue la cauena en la que teimina la piimeia mitau, y a la que
llamamos JonJePoror:
function r = palindromo1(texto)
auxiliar=char();

pos=1;
for i=1:length(texto)
if (~isspace(texto(i)))
auxiliar(pos)=texto(i);
pos=pos+1;
end
end

if mod(length(auxiliar), 2)==1
dondeParar=floor(length(auxiliar)/2);
else
dondeParar=length(auxiliar)/2;
end

dondeParar
end
P(#)*+# NNUO 2- )+'*/& '8 -, P(#)*+# NNN -8 ,e,'*0&: (#,: -h#8,: .,%, )&#&)8% '+#'8 .,%,% -,
)&0.%&S,)*+#
Si ejecutamos con un pai ue ejemplos, obtenemos esto:
46 ejercicios resueltos Je HATlAB
117
N U V 6 W 7 X Y Z N\ NN NU NV N6 NW N7 NX
P i o b l e m a s u e N A T L A B
8 corocteres 8 corocteres

>> texto

texto =

Pioblemas ue NATLAB

>> palinuiomo1(texto)

uonuePaiai =

8
N U V 6 W 7 X Y
A B C B B C B A
4 corocteres 4 corocteres

>> palinuiomo1('ABCBBCBA')

uonuePaiai =

4
P*/(%, X6O I8$8%0*#,)*+# '8 JonJePurur 8# @(#)*+# '8 -, -&#/*$(' .,% & #&# '8 -, ),'8#,
Ahoia, nos queua solamente completai el couigo paia que se iealice la
compiobacion: la funcion uevolvei 1 o u segn el texto pasauo como paimetio
sea o no, iespectivamente, palinuiomo. El iesultauo lo almacenamos en la vaiiable
r, que vale inicialmente 1 (linea iesaltaua en amaiillo) y que ponemos a u en el
momento en que uetectamos uos caiacteies no coinciuentes (en el if iesaltauo en
veiue):
Hocorio Polo 0soolo
118
function r = palindromo1(texto)
auxiliar=char();

pos=1;
for i=1:length(texto)
if (~isspace(texto(i)))
auxiliar(pos)=texto(i);
pos=pos+1;
end
end

if mod(length(auxiliar), 2)==1
dondeParar=floor(length(auxiliar)/2);
else
dondeParar=length(auxiliar)/2;
end

r=1;
for i=1:dondeParar
caracterIzda=auxiliar(i);
caracterDcha=auxiliar(length(auxiliar)-i+1);
if caracterIzda~=caracterDcha
r=0;
end
end
end
P(#)*+# NNVO I8$8%0*#,)*+# '8 :* 8- texto 8: & #& .,-h#'%&0& )&# (# S()-8 for
Bagamos una tiaza ue la funcion paia ilustiai su funcionamiento. Supongamos que
el texto pasauo es Problemos Je HATlAB, que ya ha siuo piepiocesauo (con lo que
ouxilior vale ProblemosJeHATlAB) y que JonJePoror=8.
D&08#$,%*&: '&#'8>,%,% % * ),%,)$8%"Q', ),%,)$8%I)F, ),%,)$8%"Q',p^),%,)$8%I)F,
Estamos en
la linea r=1
8 1
Entiamos al
bucle
8 1 1 P B
En el if
maicauo en
veiue. r se
pone a u
8 u 1 P B Falso
Reentiamos
en el bucle y
compaiamos
en el if veiue
8 u 2 i A Falso
8 u S o L Falso
8 u 4 b T Falso
8 u S l A Falso
8 u 6 e N Falso
8 u 7 m e Falso
8 u 8 a u Falso
Fn este punto se olconzo lo conJicin Je poroJo Jel bucle, pues i=8=uonuePaiai. lo funcin
termino con i=u, que es el volor que se Jevuelve.
Si bien el couigo que hemos mostiauo funciona, lo cieito es que pueue mouificaise
paia que sea ms eficiente: en efecto, ya uesue la piimeia compaiacion que
46 ejercicios resueltos Je HATlAB
119
apaiece en la teiceia fila ue la tabla se compiueba que el texto pasauo no es
palinuiomo: es uecii, uesue el momento en que encontiamos uos caiacteies no
coinciuentes, ya pouemos teiminai la ejecucion ue la funcion uevolvienuo un ceio.
Solucion 2.
0na foima ue mejoiai el ienuimiento es foizai al couigo ue la Funcion 11S a que
teimine en cuanto uetecte una uifeiencia. 0na foima ue aiieglailo es incluyenuo
una sentencia return justamente uespus ue la asignacion r=0:
function r = palindromo2(texto)
auxiliar=char();

pos=1;
for i=1:length(texto)
if (~isspace(texto(i)))
auxiliar(pos)=texto(i);
pos=pos+1;
end
end

if mod(length(auxiliar), 2)==1
dondeParar=floor(length(auxiliar)/2);
else
dondeParar=length(auxiliar)/2;
end

r=1;
for i=1:dondeParar
caracterIzda=auxiliar(i);
caracterDcha=auxiliar(length(auxiliar)-i+1);
if caracterIzda~=caracterDcha
r=0;
return;
end
end
end
P(#)*+# NN6O 2'*)*+# '8 (# return .,%, .%&;&),% (#, n:,-*', *#)&#'*)*&#,-o '8 -, @(#)*+#
Como en otios lenguajes, en cuanto NATLAB encuentia una instiuccion return en
la ejecucion ue una funcion, teimina su ejecucion y ietoina el valoi que
coiiesponua (el ue r, en el ejemplo, que es ceio). Eso es lo que se llama una "saliua
inconuicional" que, si lo ueseamos, pouemos evitaila pues, en cieito mouo, viola
los piincipios ue la piogiamacion estiuctuiaua.
Solucion S.
Paia mejoiai el ienuimiento ue la funcion, que paie en cuanto se sepa que el texto
no es un palinuiomo y evitai colocai, como hemos hecho en la ltima solucion, una
saliua inconuicional, sustituiiemos el ltimo bucle for ue la Funcion 11S poi otia
estiuctuia ue contiol, ue maneia que la compaiacion ue los caiacteies se ejecute
mientros los que se estn compaianuo sean iguales.
Hocorio Polo 0soolo
12u
En la siguiente funcion, cambiamos el wbile
function r = palindromo2(texto)
auxiliar=char();

pos=1;
for i=1:length(texto)
if (~isspace(texto(i)))
auxiliar(pos)=texto(i);
pos=pos+1;
end
end

if mod(length(auxiliar), 2)==1
dondeParar=floor(length(auxiliar)/2);
else
dondeParar=length(auxiliar)/2;
end

r=1;
i=1;
while i<=dondeParar && r==1
caracterIzda=auxiliar(i);
caracterDcha=auxiliar(length(auxiliar)-i+1);
if caracterIzda~=caracterDcha
r=0;
end
i=i+1;
end
end
P(#)*+# NNWO B(:$*$(*0&: 8- T-$*0& for '8 -, P(#)*+# NNV c.C/*#, NNYd .&% (# whlle
Solucion 4.
0na foima ms ue solucionai el pioblema consiste en colocai la palabia oiiginal
(que tenemos guaiuaua, ya sin espacios, en una vaiiable que, poi ejemplo, se llame
JelBerecbo), en otio vectoi, en el que la guaiuamos "uaua la vuelta", y poi lo que lo
llamaiemos JelReves:
N U V 6 W 7 X Y
JelBerecbo a n i l i n a s
JelReves s a n i l i n a
Luego, como hemos hecho antes, pouemos ii compaianuo posicion a posicion con
un for ue piincipio a fin, con un for con un salto inconuicional o con un wbile.
Tambin pouemos, sin embaigo, utilizai el opeiauoi == ue NATLAB paia
compaiai los uos vectoies, que es lo que hacemos en la siguiente funcion:
46 ejercicios resueltos Je HATlAB
121
function r = palindromo4(texto)
delDerecho=char();

pos=1;
for i=1:length(texto)
if (~isspace(texto(i)))
delDerecho(pos)=texto(i);
pos=pos+1;
end
end

delReves=char();
for i=1:length(delDerecho)
delReves(i)=delDerecho(length(delDerecho)-i+1);
end

delDerecho
delReves

r=delDerecho==delReves;
end
P(#)*+# NN7O B&-()*+# c*#)&0.-8$,d ,- .%&S-80, '8- .,-h#'%&0& 08'*,#$8 -, )&0.,%,)*+# '8 '&:
;8)$&%8:
En el couigo anteiioi, guaiuamos el texto oiiginal sin espacios en la vaiiable
JelBerecbo. Luego, en el bucle for iesaltauo, colcoamos en JelReves el texto al ievs.
Bespus ue este for apaiecen, sin punto y coma al final, los nombies ue las
vaiiables JelBerecbo JelBerecbo y JelReves paia que, con fines infoimativos,
NATLAB nos muestie su valoi. Finalmente, en la sentencia maicaua en veiue,
asignamos a r el vectoi que iesulta ue compaiai (con el opeiauoi ==) los uos
vectoies JelBerecbo y JelReves.
En la figuia siguiente apaiecen uos ejemplos ue uso ue la funcion anteiioi: en
amaiillo la palabia (la ue la izquieiua es un palinuiomo; la ue la ueiecha, no); en
veiue, los valoies ue los vectoies JelBerecbo y JelReves; finalmente, en moiauo, el
vectoi ue 1 y u que iesulta ue compaiai ambos vectoies, posicion a posicion.
>> palinuiomo4('ieconocei')

uelBeiecho =
ieconocei

uelReves =
ieconocei


ans =

1 1 1 1 1 1 1 1 1
>> palinuiomo4('uualiuau')

uelBeiecho =
uualiuau

uelReves =
uauilauu


ans =

1 u u u u u u 1
P*/(%, XW
Hocorio Polo 0soolo
122
El texto pasauo como paimetio sei un palinuiomo si la suma ue los elementos
uel vectoi iesultante (el que apaiece en moiauo) es igual a la longituu uel vectoi
JelBerecbo (o JelReves, uaiia igual). Poi tanto, hacemos un pequeo cambio en las
ltimas lineas uel couigo ue la Funcion 116 y la uejamos ue este mouo:
function r = palindromo4(texto)
delDerecho=char();

pos=1;
for i=1:length(texto)
if (~isspace(texto(i)))
delDerecho(pos)=texto(i);
pos=pos+1;
end
end

delReves=char();
for i=1:length(delDerecho)
delReves(i)=delDerecho(length(delDerecho)-i+1);
end

r=delDerecho==delReves;

if (sum(r)==length(delDerecho))
r=1;
else
r=0;
end
end
P(#)*+# NNXO 1&'*@*),)*+# '8- )+'*/& '8 -, P(#)*+# NN7 .,%, R(8 :8 '8;(8-;, (# N & (# \
En el tiozo maicauo en amaiillo pieguntamos si la suma ue los elementos ue r
coinciue con la longituu uel vectoi con el texto sin espacios: en caso afiimativo,
mouificamos el valoi ue r paia que valga 1; en caso negativo, lo mouificamos
tambin (hasta ahoia eia un vectoi ue unos y ceios) paia que valga ceio.
0n cambio auicional, paia que el couigo apaiezca ms compacto, es el que se
muestia a continuacion:
function r = palindromo4(texto)
delDerecho=char();

pos=1;
for i=1:length(texto)
if (~isspace(texto(i)))
delDerecho(pos)=texto(i);
pos=pos+1;
end
end

delReves=char();
for i=1:length(delDerecho)
delReves(i)=delDerecho(length(delDerecho)-i+1);
46 ejercicios resueltos Je HATlAB
12S
end

r= (sum(delDerecho==delReves)==length(delDerecho));
end
P(#)*+# NNYO B(:$*$(*0&: ;,%*,: -h#8,: '8- @*#,- '8 -, P(#)*+# NNX .&% (#, :&-,
En la linea amaiilla estamos asignanuo a r el iesultauo ue compaiai (==) la suma
uel vectoi iesultante ue, a su vez, compaiai los vectoies JelBerecbo y JelReves con
la longituu uel vectoi JelBerecbo: bsicamente, hacemos lo mismo que en las
ltimas lineas ue la Funcion 117, peio en menos espacio:

N U V 6 W 7 X Y Z
JelBerecbo i e c o n o c e i
JelReves i e c o n o c e i
JelBerecbo==JelReves 1 1 1 1 1 1 1 1 1

sum{JelBerecbo==JelReves) 9
lenqtb{JelBerecbo) 9
r 1
Solucion S. Con iecuisiviuau.
Tambin pouemos ueteiminai iecuisivamente si un texto es o no un palinuiomo
meuiante una funcion iecuisiva: en efecto, un texto es un palinuiomo si su piimeia
letia es igual a la ltima y lo que hay entie meuias es un palinuiomo. El caso se
base se ua cuanuo, paia compaiai, nos queue 1 o ningn caictei:
function r = palindromoRecursivo(texto)
auxiliar=char();

pos=1;
for i=1:length(texto)
if (~isspace(texto(i)))
auxiliar(pos)=texto(i);
pos=pos+1;
end
end

if length(auxiliar)<=1
r=1;
else
if auxiliar(1)==auxiliar(length(auxiliar))
auxiliar=auxiliar(1, 2:length(auxiliar)-1);
r=palindromoRecursivo(auxiliar);
else
r=0;
end
end
end
P*/(%, X7O I8$8%0*#,)*+# %8)(%:*;, '8 -&: .,-h#'%&0&:
Hocorio Polo 0soolo
124
J98%)*)*& 6VO J- 0&#$8
?# ;8)$&% 8: (# monte :* :( .%*08%, 0*$,' 8: )%8)*8#$8< -, :8/(#',
'8)%8)*8#$8 A< ,'80C:< 8- ;8)$&% 8: (# .,-h#'%&0&O J:)%*S*% (#, @(#)*+# R(8
'8$8%0*#8 :* 8- ;8)$&% v R(8 :8 .,:, )&0& .,%C08$%& 8: & #& (# 0&#$8O
Solucion 1.
Los uos vectoies siguientes (ue longituues pai e impai) son , segn la uefinicion
anteiioi, montes:
N U V 6 W 7 X Y
a b c u u c b a

N U V 6 W 7 X
a b c u c b a

Nuy iesumiuamente, pouiiamos esciibii ue la siguiente foima la expiesion paia
ueteiminai si un vectoi v es un monte:
esPolinJromo{v) y esto0rJenoJo{mitoJ{v, l)) y esto0rJenoJo{olReves{mitoJ{v, B)))
En la expiesion anteiioi, esPolinJromo{v) uevuelve 1 si el vectoi pasauo es
palinuiomo y u en caso contiaiio (y pueue sei cualquieia ue las cuatio funciones
que hemos implementauo paia el pioblema anteiioi); esto0rJenoJo{v) uevuelve 1
si el vectoi v est oiuenauoi y u en caso contiaiio; mitoJ{v, l) uevuelve la mitau
izquieiua ue v; mitoJ{v, B) uevuelve la mitau ueiecha ue v; olReves{v) uevuelve el
vectoi v al ievs (el piimei elemento en el ltimo lugai, el segunuo en el
penltimo. y el ltimo en el piimeio): lo que estamos uicienuo es que v es un
monte si es palinuiomo, si su mitau izquieiua est oiuenaua y si su mitau ueiecha,
al ievs, est tambin oiuenaua.
Pouemos tiauucii la expiesion anteiioi uiiectamente a una funcion NATLAB:
function r = monte(v)
r=palindromo4(v) && estaOrdenado(mitad(v, 'I')) &&
estaOrdenado(alReves(mitad(v, 'D')));
end

P(#)*+# NNZO I8$8%0*#,)*+# '8 :* (# ;8)$&% 8: & #& (# 0&#$8 08'*,#$8 -, )&#9(#)*+# '8 @(#)*&#8:
Ahoia falta, eviuentemente, implementai las funciones esto0rJenoJo, mitoJ y
olReves. La funcion paia ueteiminai si es palinuiomo es la funcion polinJromo4
(Funcion 118).
La funcion esto0rJenoJo es muy sencilla: iecoiiemos el vectoi uesue la posicion 2
hasta el final: si, en algn momento, encontiamos que el valoi en la posicion i-1 es
menoi que el valoi ue la posicion i, entonces uevolvemos un ceio meuiante una
saliua inconuicional (vase Funcion 114, nmeio 119); si llegamos al final uel
vectoi, entonces es poique el vectoi si est oiuenauo y uevolvemos un 1:
46 ejercicios resueltos Je HATlAB
12S
function r = estaOrdenado(v)
r=1;
for i=2:length(v)
if v(i)<v(i-1)
r=0;
return;
end
end
end

P(#)*+# NU\O I8$8%0*#,0&: :* 8- ;8)$&% 8:$C &%'8#,'&
La funcion mitoJ toma uos paimetios: el vectoi uel que queiemos extiaei la
mitau y un caictei que iepiesenta qu mitau queiemos extiaei: la izquieiua ('I) o
la ueiecha ('B):
function r = mitad(v, lado)
if mod(length(v), 2)==0
pararEn=length(v)/2;
else
pararEn=floor(length(v)/2);
end

if lado=='D'
pararEn=length(v)-pararEn+1;
end

r=[];
if lado=='I'
for i=1:pararEn
r=[r v(i)];
end
else
for i=length(v):-1:pararEn
r=[v(i) r];
end
end
end
P(#)*+# NUNO J=$%,))*+# '8 -, 0*$,' *QR(*8%', & '8%8)F, '8 (# ;8)$&%
Finalmente, la funcion olReves coloca los elementos ue un vectoi, en oiuen inveiso,
en otio vectoi:
function r = alReves(v)
r=[];
for i=length(v):-1:1
r(length(v)-i+1)=v(i);
end
end
P(#)*+# NUUO D&-&),)*+#< ,- %8;[:< '8 -&: 8-808#$&: '8 (# ;8)$&%
Be este mouo, la ejecucion ue la funcion ua los siguientes iesultauos paia los
ejemplos que se muestian:
Hocorio Polo 0soolo
126
>> v=|1 2 S 4 S 2j No es un palinuiomo

v =

1 2 S 4 S 2

>> monte(v)

ans =

u
>> v=|1 2 1 4 S 2j No est
oiuenaua la mitau izquieiua

v =

1 2 1 4 S 2

>> monte(v)

ans =

u
>> v=|1 2 S 4 S Sj No es un palinuiomo y
no est oiuenaua la mitau ueiecha

v =

1 2 S 4 S S

>> monte(v)

ans =

u
>> v=|1 2 S 4 S 2 1j Es un monte

v =

1 2 S 4 S 2 1

>> monte(v)

ans =

1
P*/(%, XXO 2-/(#&: 8980.-&: '8 898)()*+# '8 -, @(#)*+# monte cP(#)*+# NNZ< .C/*#, NU6d
Solucion 2.
Si obseivamos los ejemplos anteiioies, nos uamos cuenta ue que, en iealiuau, paia
ueteiminai si un vectoi es un monte basta con compiobai si es un palinuiomo y si
est oiuenaua su mitau izquieiua pues, si sta est oiuenaua y touo el vectoi es un
palinuiomo, foizosamente la mitau ueiecha estai oiuenaua ue maneia
uecieciente. Es uecii, que a la conjuncion ue funciones que esciibiamos en la
Funcion 119 (pgina 124) le pouemos quitai la ltima llamaua:
function r = monte(v)
r=palindromo4(v) && estaOrdenado(mitad(v, 'I'));
% && estaOrdenado(alReves(mitad(v, 'D')));
end

P(#)*+# NUVO H& 8: #8)8:,%*& )&0.%&S,% 8- &%'8# 8# -, 0*$,' '8%8)F,
Solucion S.
Supongamos ahoia que queiemos sabei los motivos poi los que el vectoi no es un
monte: pueue sei que no sea un palinuiomo o sus uos mitaues no estn oiuenauas.
En este caso, uebeiiamos aauii alguna instiuccion paia que se muestien los
coiiesponuientes mensajes.
Las funciones polinJromo4 (que es la que utilizamos) y esto0rJenoJo queuan como
sigue:
46 ejercicios resueltos Je HATlAB
127
function r = palindromo4(texto)
delDerecho=char();

pos=1;
for i=1:length(texto)
if (~isspace(texto(i)))
delDerecho(pos)=texto(i);
pos=pos+1;
end
end

delReves=char();
for i=1:length(delDerecho)
delReves(i)=delDerecho(length(delDerecho)-i+1);
end

r= (sum(delDerecho==delReves)==length(delDerecho));

if r==0
disp('No es un monte porque:');
disp('-No es un palndromo');
end
end
function r = estaOrdenado(v)
r=1;
for i=2:length(v)
if v(i)<v(i-1)
r=0;
disp('-No est ordenado');
return;
end
end
end
P(#)*+# NU6O "#:$%())*&#8: ,'*)*&#,-8: .,%, 0&:$%,% 08#:,98:
Ahoia, al ejecutai la funcion monte (Funcion 12S) con el vectoi v=[1 2 1 4 S 2],
espeiamos que nos uiga que no es un monte poique no es un palinuiomo y auems
no est oiuenauo. Sin embaigo, al ejecutaila con ese ejemplo, el iesultauo es:
>> v=|1 2 1 4 S 2j

v =
1 2 1 4 S 2

>> monte(v)
No es un monte poique:
-No es un palinuiomo

ans =
u
P*/(%, XY
Hocorio Polo 0soolo
128
Como vemos, se nos ua solo uno ue los uos mensajes que espeibamos. Esto
suceue poique, en la Funcion 12S, las llamauas a polinJromo4 y a esto0rJenoJo
estn sepaiauas con : al usai estos uos simbolos paia enlazai uos conuiciones,
NATLAB uetiene la ejecucion en el momento en que encuentia una falsa. En el
ejemplo ue v=[1 2 S 1 2 S], puesto que el vectoi no es un palinuiomo, ya no se
evala la segunua funcion, que ueteimina el oiuen.
Paia que se evalen touas las conuiciones uebemos usai un solo :
function r = monte(v)
r=palindromo4(v) & estaOrdenado(mitad(v, 'I'));
end

P(#)*+# NUWO D&# (# :&-& umperxunJ, :*80.%8 :8 8;,-T,# ,0S,: @(#)*&#8:
Como se ve, los iesultauos son uifeientes:
.,-*#'%&0&6c;d qq 8:$,M%'8#,'&c0*$,'c;< r"rdd_ .,-*#'%&0&6c;d q 8:$,M%'8#,'&c0*$,'c;< r"rdd_
>> v

v =

1 2 1 4 S 2

>> monte(v)
No es un monte poique:
-No es un palinuiomo

ans =

u
>> v

v =

1 2 1 4 S 2

>> monte(v)
No es un monte poique:
-No es un palinuiomo
-No est oiuenauo

ans =

u
P*/(%, XZO 4&: %8:(-$,'&: .(8'8# :8% '*@8%8#$8: :8/T# (:80&: q & qq

46 ejercicios resueltos Je HATlAB
129
J98%)*)*& 66O DC-)(-& '8 .* csd
18'*,#$8 8- ,-/&%*$0& '8 1&#$8),%-& 8: .&:*S-8 ),-)(-,% 8- ;,-&% ,.%&=*0,'&
'8 sO >,%$*0&: '8 (#, )*%)(#@8%8#)*, '8 %,'*& N *#:)%*$, 8# (# )(,'%,'& '8
-,'& UO >,%, ,.%&=*0,% 8- ;,-&% '8 s< -,#Q,0&: (# #T08%& /%,#'8 '8 ',%'&:
,-8,$&%*,08#$8 '8#$%& '8- )(,'%,'&O 2- $8%0*#,% 8- .%&)8:&< -, .%&.&%)*+#
8#$%8 8- #T08%& '8 ',%'&: '8#$%& '8- )h%)(-& A 8- #T08%& '8 ',%'&: $&$,-8:
:8%C ,.%&=*0,',08#$8 */(,- , -, %,-)*+# 8#$%8 -, :(.8%@*)*8 '8- )h%)(-& A -,
:(.8%@*)*8 '8- )(,'%,'&O >(8:$& R(8 )&#&)80&: -, :(.8%@*)*8 '8- )(,'%,'&
cluJo x luJo = 2x2 = 4) A -, 8=.%8:*+# .,%, ),-)(-,% -, '8- )h%)(-&
cnruJlo
2
=n1
2
d< .&'80&: '8:.89,% (# ;,-&% ,.%&=*0,'& .,%, sO
totales
crculo
totales
crculo
totales
crculo
cuadrado
crculo
dardos
dardos
dardos
dardos
dardos
dardos
S
S
! 4
4
! "
" ! "
" !
#
#


P*/(%, Y\O I8$8%0*#,)*+# '8- ;,-&% ,.%&=*0,'& '8 s
B8 .*'8 -, 8:)%*$(%, '8 (#, @(#)*+# 8# 123425 R(8 $&08 )&0& .,%C08$%& 8-
#T08%& '8 ',%'&: R(8 :8 '8:8, -,#Q,% cnd A '8;(8-;, 8- ;,-&% ),-)(-,'& .,%,
sO
Solucion 1.
Conociuo el valoi ue n, meuiante un bucle for i=1:n simulaiemos el lanzamiento ue
los n uaiuos. Asumienuo que el centio uel ciiculo (y uel cuauiauo) estn en las
cooiuenauas {0, 0), caua uaiuo caei en uos cooiuenauas aleatoiias {x, y), sienuo
caua valoi ue x y ue y un nmeio entie -1 y +1. Paia ueteiminai si un uaiuo ha
caiuo uentio uel ciiculo utilizaiemos el teoiema ue pitgoias: si la suma ue los
cuauiauos ue x y ue y es menoi que la hipotenusa (que vale 1), el uaiuo est uentio,
y fueia en otio caso.
La siguiente funcion es una posible solucion: en ella, las cooiuenauas x e y ue caua
uaiuo se geneian en las uos lineas maicauas en amaiillo con la funcion ronJ{), que
geneian un nmeio aleatoiio entie u y 1; como se obseiva, multiplicamos x poi
siqnoX e y poi siqnoY, que siiven paia ueteiminai si la cooiuenaua iespectiva es
positiva o negativa (el signo se ueteimina en funcion ue que otio nmeio aleatoiio
sea o no mayoi que u.S); a continuacion compiobamos si la suma ue sus cuauiauos
ue x e y es menoi o igual a 1 (if maicauo en veiue), caso en el que inciementamos
la vaiiable nJ, que iepiesenta el nmeio ue uispaios que han caiuo Jentro uel
ciiculo. Al finalizai el bucle, calculamos el valoi apioximauo ue meuiante la
expiesion ue la Figuia 8u:
Hocorio Polo 0soolo
1Su
function result=piMontecarlo(n)
nd=0;
result=0;

for i=1:1:n
if rand()<=0.5
signoX=-1;
else
signoX=+1;
end
if rand()<=0.5
signoY=-1;
else
signoY=+1;
end

x=rand()*signoX;
y=rand()*signoY;

if (x^2+y^2<=1)
nd=nd+1;
end
end
result=4*nd/n;

end
P(#)*+# NU7O DC-)(-& ,.%&=*0,'& '8 s 08'*,#$8 8- 0[$&'& '8 1&#$8),%-&
Bos ejecuciones uistintas ue la funcion paia n=100.000 nos uan los siguientes
iesultauos:
>> piNontecailo(1uuuuu)

ans =

S.14S16
>> piNontecailo(1uuuuu)

ans =

S.144S6
P*/(%, YNO I&: ;,-&%8: '8 s S,:$,#$8 ,.%&=*0,'&: ,- ;,-&% %8,-
Solucion 2.
Puesto que, al ueteiminai si el uaiuo est uentio o fueia elevamos al cuauiauo las
uos cooiuenauas uel uaiuo (lineas en veiue ue la funcion anteiioi), no es pieciso
geneiai el signo, pues en la compaiacion la suma no sei nunca un nmeio
negativo. Poi tanto, el couigo pueue simplificaise sin peiuei efectiviuau:
46 ejercicios resueltos Je HATlAB
1S1
function result=piMontecarlo2(n)
nd=0;
result=0;

for i=1:1:n
x=rand();
y=rand();

if (x^2+y^2<=1)
nd=nd+1;
end
end
result=4*nd/n;

end
P(#)*+# NUXO 4, P(#)*+# NU7 .(8'8 :*0.-*@*),%:8 A #& /8#8%,% :*/#&: .,%, -,: )&&%'8#,',:
Solucion S.
Auems ue calculai el valoi apioximauo ue , pouemos hacei que NATLAB nos
uibuje el ciiculo ue iauio 1 y los puntos que iepiesentan los lugaies en que han
caiuo los uaiuos. Paia ello, usaiemos la funcion plot{x, y), que uibuja un punto en
las cooiuenauas que se pasan como paimetio, y una seiie ue instiucciones paia
que se uibuje el ciiculo. Nouificamos el couigo ue la piimeia solucion que hemos
uauo a este ejeicicio (Funcion 126, pgina 1Su).
function result=piMontecarlo3(n)
nd=0;
result=0;

for i=1:1:n
if rand()<=0.5
signoX=-1;
else
signoX=+1;
end
if rand()<=0.5
signoY=-1;
else
signoY=+1;
end

x=rand()*signoX;
y=rand()*signoY;
plot(x, y);
hold on;

if (x^2+y^2<=1)
nd=nd+1;
end
end
t=0:pi/30:2*pi;
x=cos(t); y=sin(t);
plot(x, y, 'red');
result=4*nd/n;
end
P(#)*+# NUYO DC-)(-& ,.%&=*0,'& '8 s A :( %8.%8:8#$,)*+# /%C@*),
Hocorio Polo 0soolo
1S2
En el couigo anteiio se maican en amaiillo las instiucciones plot y bolJ on. sta es
necesaiia paia que touos los puntos se pinten en la misma ventana.
En azul apaiecen ties lineas que utilizamos paia uibujai un ciiculo iojo ue iauio 1:
en la piimeia cieamos un vectoi t con touos los valoies uesue u hasta 2
inciementanuo ue Su en Su. En la segunua cieamos uos vectoies x e y con,
iespectivamente, el coseno y el seno ue caua valoi almacenauo en t. Finalmente, en
la teiceia uibujamos, en iojo (reJ) los vectoies que acabamos ue calculai y que
tenemos almacenauos en x e y.
El iesultauo poi consola es:
>> piNontecailoS(1uuuuu)

ans =

S.146S6
P*/(%, YU
Y el iesultauo en la ventana gifica, en la que se apiecian los cien mil puntos y la
ciicunfeiencia en iojo es:

P*/(%, YVO L8.%8:8#$,)*+# '8 -, )*%)(#@8%8#)*, /&#*&0[$%*), A -&: N\\O\\\ ',%'&: -,#Q,'&:
46 ejercicios resueltos Je HATlAB
1SS
J98%)*)*& 6WO 4, :,-*', '8- -,S8%*#$&
I*:.&#80&: '8 (#, 0,$%*Q '8 nxm cR(8 %8.%8:8#$, (# -,S8%*#$&d 8# -, R(8
F,A ;,-&%8: )8%& A (#&O 4&: ;,-&%8: (#& %8.%8:8#$,# 0(%&: A -&: ;,-&%8: )8%&
%8.%8:8#$,# Q&#,: .&% -,: R(8 .(8'8 ),0*#,%:8O B8 .*'8 8:)%*S*% (#, @(#)*+#
8# 123425 R(8 $&08 )&0& .,%C08$%&: (#, 0,$%*Q R(8 %8.%8:8#$8 8-
-,S8%*#$&< -,: )&&%'8#,',: '8 -, 8#$%,', A -, '8 -, :,-*',< A R(8 .8%0*$,<
08'*,#$8 0&;*0*8#$&: ,-8,$&%*&: '8 (# &S98$&< --8/,% '8:'8 ,R(8--, F,:$,
[:$,O
4, :*/(*8#$8 0,$%*Q c'8 -, R(8 :8 F,# &0*$*'& -&: )8%&: .&% )-,%*','d
%8.%8:8#$, (# -,S8%*#$& '8 N\=N\< )&# -, 8#$%,', 8# cN\< N\d A -, :,-*', 8#
cN<Nd]
N U V 6 W 7 X Y Z N\
N
S 1 1
U
1 1 1 1 1
V
1 1 1
6
1 1 1 1 1
W
1
7
1 1 1 1 1 1
X
1 1
Y
1 1 1 1 1
Z
1
N\
1 E
Solucion 1.
El objeto movil uisponui en caua momento ue unas cooiuenauas, que coinciuiin
al piincipio con las ue la entiaua y que se iin actualizanuo mientias no coinciuan
con las ue la saliua.
Caua movimiento uel movil lo geneiaiemos con un nmeio aleatoiio que
iepiesentai la uiieccion en la que el objeto se pueua movei: aiiiba, abajo, ueiecha
e izquieiua. Si, poi ejemplo, la uiieccion es hacia aiiiba, el objeto no est en la fila 1
y la casilla ue aiiiba est libie, entonces actualizamos la cooiuenaua actual uel
objeto ueciementanuo en 1 su fila. Pioceueiemos ue esta maneia paia las cuatio
uiiecciones.
En la siguiente funcion, pasamos como paimetios el labeiinto (en foima ue una
matiiz ue unos y ceios) y las cooiuenauas ue entiaua y saliua (como senuos
vectoies con uos componentes). Al entiai a la funcion mostiamos los valoies ue los
paimetios y ponemos el cionometio (funcion tic). En movimientos iiemos
guaiuanuo touos los movimientos iealizauos poi el objeto, cuya cooiuenaua actual
la guaiuamos, en caua momento, en la vaiiable coorJenoJoActuol. Entonces,
mientias la cooiuenaua uel objeto no coinciua con la cooiuenaua ue la saliua,
geneiamos un nmeio aleatoiio entie u y 1 (meuiante ronJ{)) que almacenamos
en la vaiiable Jireccion. En funcion ue su valoi, compiobamos si est uentio ue los
limites uel labeiinto, calculamos la nueva cooiuenaua (que guaiuamos en
siquiente) sumanuo o iestanuo una fila o columna a la coorJenoJoActuol. Tias
habei calculauo la nueva posicion, si sta no coinciue con un muio (es uecii, la
Hocorio Polo 0soolo
1S4
casilla en el labeiinto es ceio), actualizamos la coorJenoJoActuol, almacenamos la
nueva posicion en el vectoi ue movimientos y paiamos el cionometio paia sabei
cunto se ha taiuauo en encontiai la saliua.
function [movimientos] = laberinto1( laberinto, entrada, salida )
entrada
salida
laberinto
tic

movimientos=[];
coordenadaActual=entrada;
movimientos=[movimientos; coordenadaActual];

while (coordenadaActual(1)~=salida(1) ||
coordenadaActual(2)~=salida(2))
direccion=rand();
% <=0.25: arriba; <=0.5: derecha;
% <=0.75: abajo; <=1: izquierda
if direccion<=0.25 & coordenadaActual(1)>1
siguiente(1)=coordenadaActual(1)-1;
siguiente(2)=coordenadaActual(2);
elseif direccion<=0.5 & coordenadaActual(2)<length(laberinto)
siguiente(1)=coordenadaActual(1);
siguiente(2)=coordenadaActual(2)+1;
elseif direccion<=0.75 &
coordenadaActual(1)<length(laberinto(:, 1))
siguiente(1)=coordenadaActual(1)+1;
siguiente(2)=coordenadaActual(2);
elseif direccion<=1 & coordenadaActual(2)>1
siguiente(1)=coordenadaActual(1);
siguiente(2)=coordenadaActual(2)-1;
end
if laberinto(siguiente(1), siguiente(2))==0
coordenadaActual=siguiente;
movimientos=[movimientos; coordenadaActual];
end
end

toc
end
P(#)*+# NUZO 5T:R(8', ,-8,$&%*, '8- ),0*#& '8 :,-*', '8 (# -,S8%*#$&
Si ejecutamos la funcion con la siguiente linea ue comanuo:
Jisp{['Solucin olconzoJo en ' int2str{lenqtb{loberinto1{lob, ent, soliJo))) ' movimientos'])
.el iesultauo es:
46 ejercicios resueltos Je HATlAB
1SS
>> uisp(|'Solucion alcanzaua en ' int2sti(length(labeiinto1(lab, ent, saliua)))
' movimientos'j)

entiaua =
1u 1u


saliua =
1 1


labeiinto =

u 1 u u u u 1 u u u
u 1 u 1 1 1 1 u u u
u 1 u 1 u u 1 u u u
u 1 u 1 u u 1 1 1 u
u 1 u u u u u u u u
u 1 u 1 1 1 1 u 1 u
u u u 1 u u u u 1 u
1 1 1 1 u u u u 1 u
u u u u u u u u 1 u
u u u u u u u u 1 u

Elapseu time is u.u2191S seconus.
Solucion alcanzaua en 1118 movimientos
P*/(%, Y6
El comanuo Jisp que esciibimos en la consola ue NATLAB compone un vectoi ue
ties cauenas ue caiacteies: la piimeia es el texto Solucin olconzoJo en; la segunua,
la tiansfoimacion a texto ue la longituu uel iesultauo ue ejecutai la funcion
loberinto1 con los valoies que pasamos como paimetios; la teiceia, la cauena
movimientos.
Solucion 2.
Supongamos que se uesea que la saliua ue la funcion muestie las casillas que ha
iecoiiiuo el objeto paia llegai uesue la entiaua a la saliua. En este caso, una vez
calculauos los movimientos necesaiios, uebemos iecoiiei este vectoi, tomai caua
una ue sus cooiuenauas y colocai, en las posiciones que inuique, algn valoi (el 2,
poi ejemplo) sobie el labeiinto, ue maneia que se iepiesenten las casillas visitauas.
Esto es lo que hacemos en la Funcion 1Su con el bucle aauiuo al final: iecoiiemos
el vectoi ue movimientos (foimauo a su vez poi vectoies ue uos cooiuenauas) y,
paia caua cooiuenaua conteniua en l, vamos a la posicion coiiesponuiente en el
loberinto y colocamos el valoi 2. Finalmente, asignamos el nuevo labeiinto a la
vaiiable comino, que es la vaiiable que uevuelve el iesultauo ue la funcion.
Hocorio Polo 0soolo
1S6
function camino = laberinto2( laberinto, entrada, salida )
entrada
salida
laberinto
tic

movimientos=[];
coordenadaActual=entrada;
movimientos=[movimientos; coordenadaActual];

while (coordenadaActual(1)~=salida(1) ||
coordenadaActual(2)~=salida(2))
direccion=rand();
% <=0.25: arriba; <=0.5: derecha;
% <=0.75: abajo; <=1: izquierda
if direccion<=0.25 & coordenadaActual(1)>1
siguiente(1)=coordenadaActual(1)-1;
siguiente(2)=coordenadaActual(2);
elseif direccion<=0.5 & coordenadaActual(2)<length(laberinto)
siguiente(1)=coordenadaActual(1);
siguiente(2)=coordenadaActual(2)+1;
elseif direccion<=0.75 &
coordenadaActual(1)<length(laberinto(:, 1))
siguiente(1)=coordenadaActual(1)+1;
siguiente(2)=coordenadaActual(2);
elseif direccion<=1 & coordenadaActual(2)>1
siguiente(1)=coordenadaActual(1);
siguiente(2)=coordenadaActual(2)-1;
end
if laberinto(siguiente(1), siguiente(2))==0
coordenadaActual=siguiente;
movimientos=[movimientos; coordenadaActual];
end
end

for i=1:length(movimientos())
casilla=movimientos(i, :);
laberinto(casilla(1), casilla(2))=2;
end
camino=laberinto;
toc
end
P(#)*+# NV\O 1&'*@*),)*+# '8 -, P(#)*+# NUZ .,%, R(8 :8 0(8:$%8# -,: ),:*--,: ;*:*$,',:
Paia una ueteiminaua ejecucion, el iesultauo final es el siguiente:
ans =
2 1 2 2 2 2 1 u u u
2 1 2 1 1 1 1 u 2 u
2 1 2 1 u u 1 2 2 2
2 1 2 1 2 2 1 1 1 2
2 1 2 2 2 2 2 2 2 2
2 1 2 1 1 1 1 2 1 2
2 2 2 1 2 2 2 2 1 2
1 1 1 1 2 2 2 2 1 2
2 2 2 2 2 2 2 2 1 2
2 2 2 2 2 2 u u 1 2
P*/(%, YWO B8 F,# 0,%),'& -,: ),:*--,: ;*:*$,',: .&% -, P(#)*+# NV\

46 ejercicios resueltos Je HATlAB
1S7
J98%)*)*& 67O 5T:R(8', S*#,%*,
I*:.&#80&: '8 (# ;8)$&% &%'8#,'& '8 8#$8%&: '8 -&#/*$(' n. B8 .*'8 '*:8e,%
(#, @(#)*+# R(8 $&08 )&0& .,%C08$%& 8- ;8)$&% v A (# ;,-&% x A '8;(8-;,<
08'*,#$8 (#, ST:R(8', S*#,%*,< -, .&:*)*+# 8# R(8 :8 8#)(8#$%, 8- ;,-&% x
'8#$%& '8 v< & EN 8# ),:& '8 R(8 #& 8:$[O
Solucion 1.
Supongamos que tenemos el siguiente vectoi oiuenauo:
v=
N U V 6 W 7 X Y Z N\
2 2 4 6 7 8 8 9 1S 18
Supongamos que ueseamos buscai el nmeio 4 uentio ue l (o sea, x=4). Neuiante
una bsqueua binaiia, compaiamos el elemento buscauo con el que se encuentia
en la mitau uel vectoi (el S, que es un 7): como x<S, buscamos ahoia en la mitau
infeiioi (es uecii, entie las posiciones 1 a 4) y compaiamos con el elemento que
est en la mitau (el 2, que es un 2): como 2<x, buscamos entie el elemento S y el
4. Cotinuamos asi hasta que lo encontiemos o hasta que lleguemos a la conclusion
ue que el valoi x no se encuentia en el vectoi.
En la siguiente funcion uevolveiemos el iesultauo en la vaiiable r, que inicalizamos
a -1, En li y ls guaiuamos los limites infeiioi y supeiioi en los que la bsqueua est
acotaua. Nientias no encontiemos el valoi (o sea, mientias r=-1) y los limites
infeiioi y supeiioi no se ciucen (li<=ls), vamos compaianuo el elemento que
encontiamos en la mitoJ: si el valoi situauo en la mitoJ es x, actualizamos el valoi
ue r (con lo que saluiemos uel bucle); si es menoi, actualizamos el limite infeiioi li,
pues sabemos que x no estai a la izquieiua ue l; si es mayoi, actualizamos el
limite supeiioi ls poique x no estai a la ueiecha.
function r = busquedaBinaria1(v, x)
r=-1;

li=1;
ls=length(v);

while r==-1 && li<=ls
mitad=floor((ls+li)/2);
if v(mitad)==x
r=mitad;
elseif v(mitad)<x
li=mitad+1;
else
ls=mitad-1;
end
end
end
P(#)*+# NVNO 5T:R(8', S*#,%*, *$8%,$*;,
Si queiemos conocei en cuntas iteiaciones se encuentia el valoi, aauimos al
couigo anteiioi las instiucciones iesaltauas en amaiillo:
Hocorio Polo 0soolo
1S8
function r = busquedaBinaria1(v, x)
r=-1;

li=1;
ls=length(v);
iteraciones=0;

while r==-1 && li<=ls
mitad=floor((ls+li)/2);
if v(mitad)==x
r=mitad;
elseif v(mitad)<x
li=mitad+1;
else
ls=mitad-1;
end
iteraciones=iteraciones+1;
end

disp(['Valor encontrado en ' int2str(iteraciones)
' iteraciones']);
end
P(#)*+# NVUO 5T:R(8', S*#,%*, *$8%,$*;, )&# *#'*),)*+# '8- #T08%& '8 *$8%,)*&#8:
En la siguiente figuia buscamos, en el lauo izquieiuo, el nmeio 6 entie los
nmeios 1 a 1uu; en el ueiecho, buscamos el 2uu en el mismo iango ue valoies:
>> z=1:1uu Inicializamos el vectoi z con los natuiales uel 1 al 1uu

z =

Columns 1 thiough 24

1 2 S 4 .
Columns 97 thiough 1uu

97 98 99 1uu

>> busqueuaBinaiia1(z, 6)
valoi encontiauo en 4 iteiaciones

ans =

6
>> busqueuaBinaiia1(z, 2uu)
valoi encontiauo en 7 iteiaciones

ans =

-1
P*/(%, Y7O I&: %8:(-$,'&: ,- 898)($,% -, P(#)*+# NVU c:8 8#)(8#$%, 8# -, *QR(*8%',< A #& 8# -, '8%8)F,d
Solucion 2.
A continuacion uamos una veision iecuisiva ue la funcion ue bsqueua binaiia
peio, a uifeiencia ue la anteiioi, no uevolvemos la posicion en la que se encuentia
el elemento, sino solamente un 1 si est o un -1 en caso contiaiio:
46 ejercicios resueltos Je HATlAB
1S9
function r = busquedaBinaria2(v, x)
r=-1;

li=1;
ls=length(v);

mitad=floor((ls+li)/2);
if li>ls
r=-1;
return
elseif v(mitad)==x
r=1;
return;
elseif v(mitad)<x
li=mitad+1;
else
ls=mitad-1;
end
auxiliar=v(1, li:ls);
r=busquedaBinaria2(auxiliar, x);
end
P(#)*+# NVVO "0.-808#$,)*+# %8)(%:*;, '8 -, ST:R(8', S*#,%*,
En el couigo anteiioi, calculamos la mitoJ y compaiamos el elemento situauo en
esa posicion con x. Si es menoi (if amaiillo), actualizamos el limite infeiioi; si es
mayoi (else veiue), actualizamos el supeiioi. Pieviamente hemos compiobauo los
uos casos base ue la iecuisiviuau: si se ha encontiauo el elemento en la mitau,
uevolvemos un 1; si no se ha encontiauo (el limite infeiioi es mayoi que el
supeiioi), uevolvemos un -1. Cuanuo no estamos en alguno ue los uos casos base,
guaiuamos en ouxilior el subvectoi que hay entie las posiciones li a ls y llamamos
iecuisivamente a la funcion.
Supongamos que buscamos el nmeio 2u en el siguiente vectoi:
v=
N U V 6 W 7 X Y Z N\
2 2 4 6 7 8 8 9 1S 18
Al llamai a la funcion poi piimeia vez, r=-1, li=1, ls=10, mitoJ=S. Como v{S)=7<20,
se actualiza li: li=S-1=6 y ouxilior=[8 8 9 1S 18], y se llama a la funcion con este
subvectoi y el valoi x=20.
Entiamos al segunuo nivel ue iecuisiviuau. Ahoia, v es el vectoi ouxilior que nos
ha llegauo a la funcion uesue el piimei nivel:
v=
N U V 6 W
8 8 9 1S 18
Ahoia, r=-1, li=1, ls=S, mitoJ=S. Como v{S)=9<20, li=S-1=4 y ouxilior=[1S 18], y se
llama nuevamente a la funcion:
v=
N U
1S 18
En este teicei nivel ue iecuisiviuau, r=-1, li=1, ls=2, mitoJ=1. Como v{1)=1S<20,
li=1-1=2 y ouxilior=[18], llamnuose nuevamente a la funcion:
Hocorio Polo 0soolo
14u
v=
N
18
Ahoia, r=-1, li=1, ls=1, mitoJ=1. Como v{1)=18<20, se hace li=2 y iecoitamos el
vectoi uesue la posicion 2 hasta la 1, obtenienuo un vectoi vacio, con el cual
llamamos nuevamente a la funcion:
v=

En esta nueva llamaua, r=-1, li=1, ls=0, mitoJ=0. Se evala el piimei caso base ue la
iecuisiviuau (li~ls) y, como la conuicion es cieita, se va uevolvienuo el -1 hasta
llegai a la llamaua oiiginal uesue la linea ue comanuo:
>> v

v =

2 2 4 6 7 8 8 9 1S 18

>> busqueuaBinaiia2(v, 2u)

ans =

-1
P*/(%, YXO L8:(-$,'& '8 898)($,% (#, ST:R(8', S*#,%*, %8)(%:*;, 8# (# ;8)$&%< )&# %8:(-$,'&
*#@%()$(&:&

Вам также может понравиться