Introduktion:
På mat-filen /chalmers/groups/thomas_math/MATL/pie.mat
(en mat-fil innehåller data i Matlabs eget binära format)
hittar du två
vektorer, pi5
samt e5,
med de 5000000 första
siffrorna i pi respektive e. Du kan också hämta filen via denna HTML länk.
(Om du sitter i Windows-salen hittar du filen i katalogen:
\\sol.ita.chalmers.se\groups\thomas_math\MATL)
Kopiera filen till katalogen där du har dina andra Matlabfiler. Ladda sedan in innehållet (vektorerna pi5 och e5) till Matlab med kommandot load
>> load pie.mat
Om du
vill inspektera
en del av vektorn i Matlab, skriv t.ex.
>>
pi5(1:32)' % '
= transponat
ans =
Columns 1
through 16
3
1
4
1
5
9
2
6
5
3
5
8
9
7
9 3
Columns
17 through 32
2
3
8
4
6
2
6
4
3
3
8
3
2
7
9 5
>>
pi5(1000000:1000005) %
siffror
nummer 1000000
till och
med 1000005
ans =
5
1
3
0
9
2
>>
pi5(end-5:end)' %
de sex sista
siffrorna
ans =
4
6
1
9
7 1
>>
e5(1:16)'
% analogt för e
ans =
2
7
1
8
2
8
1
8
2
8
4
5
9
0
4 5
Anledningarna till att labben innehåller så stora datamängder
är bland andra:
![]() |
Uppgift 1: Skriv en
Matlabfunktion som
räknar ut antalet gånger siffrorna 0 till 9 förekommer i pi5 (eller
e5). Låt funktionen ha en inparameter, en vektor.
Det skall räcka att anropa funktionen en
gång för att få ut alla resultat. Man anropar lämpligen funktionen från
ett huvudprogram som sköter utskrifter och liknande. Tips: när du skall gå igenom en så pass lång vektor är det effektivt att gå igenom den en gång istället för att gå igenom den upprepade gånger. Detta gäller inte bara i denna uppgift. Frivilligt: Om du vill kan du studera följande kvantitet. Låt f(n, d) vara antalet gånger siffran d förekommer bland de n första siffrorna i talet. Plotta f(n, d) / n (för olika d). Detta liknar ett gränsvärde, relativa andelen när antalet siffror ökar. Gränsvärdet är 0.1 om talet är normalt. |
![]() |
Uppgift 2: Skriv en
Matlabfunktion som
räknar ut längsta sekvensen av siffran d, när d = 0, 1,
..., 9, i en talvektor. Programmet skall också tala om var i talet
dessa längsta sekvenser finns. I exemplet ovan finns siffran tre,
sju gånger i rad. Denna sekvens hittar man från siffra
710101 till och med siffra 710107. Det räcker att skriva ut de första gränserna,
710101,
710107, ifall det skulle finnas flera sekvenser med sju treor. Det
skall räcka att anropa funktionen en
gång för att få ut alla resultat (man skall inte behöva anropa den tio
gånger, vilket inte hindrar att du kan ha ytterligare en funktion som
anropas för en enstaka siffra, d). Man anropar lämpligen
funktionen från ett huvudprogram som sköter utskrifter och liknande. Testa din funktion på följande vektorer (så att du ser att den fungerar): tal = 1; % vektorlängd ett, dessutom finns inte alla siffror med tal = [1, 1, 1, 1, 1]; % en sekvens som avslutas med att vektorn "tar slut" tal = [1, 1, 1, 1, 1, 2]; % här avslutas sekvensen med annan siffra % sekvenser av olika längder (med samma siffra), den längsta sekvensen kommer inte sist tal = [2, 1, 1, 2, 3, 4, 1, 1, 1, 2, 2, 4, 5, 5, 5, 1, 1, 1, 1, 1, 5, 5, 1, 1, 1]; |
![]() |
Uppgift 3: Skriv en
Matlabfunktion som
räknar ut antalet sekvenser av längd ett, antalet sekvenser
av längd två etc. Ex: tal = [1, 2, 2, 1, 1, 1, 4, 4, 4, 4, 5, 5, 5, 1, 7, 9] har fyra sekvenser av längd ett, en av längd två, två av längd tre och en av längd fyra. Det skall räcka att anropa funktionen en gång för att få ut alla resultat. Man anropar lämpligen funktionen från ett huvudprogram som sköter utskrifter och liknande. |