Contents

Több függvény egy fájlban

A függvények egymásba is ágyazhatókak, így több függvény is szerepehet egyetlen fájlban, de kívülről csak az első függvény hívható meg:

function elso(a)
x=5;
masodik(x);
end
function masodik(b)
disp(b)

end

elso(4)
     5

itt a masodik(4) errort ad, viszont az első (=main) függvényünk használhatja a másodikat.

Változók láthatósága

Az egyes függvények scope-ja az endek elhelyezkedésétől függ. Ha nincs end a függvények végén, az ugyanaz, mintha mindegyik végén a következő function előtt lenne. Ilyenkor mindenki csak a saját változóit látja. Az end voltaképpen a scope végét is jelzi, így ha az első függvény end-je előtt szerepel a második függvény, akkor látja az első függvény válatozóit is, például:

function elso2end(a)

masodik(a)


    function masodik(b)
    disp(a)
    disp(b)
    end
end

elso2end(4)
     4

     4

Perzisztens változók

Ha egy függvény belesejében egy változó definiálásakor a persistent kulcsszót, akkor a változónk értéke (noha csak a függgvényen belülről látható), megőrződik az egyes függvényhívások között. Például:

function osszeg = halmoz(n) 

persistent ossz; 

if isempty(ossz)    
    ossz = n; 
else
    ossz = ossz + n; 
end

osszeg = ossz;

Kövessük debuggerrel a változók értékét az egyes hívások alatt! A perzisztens változók értékét a Matlab elfelejti, ha újra mentjük a függvényt, kiadjuk a clear halmoz parancsot vagy kilépünk a Matlabból.

Fájlok beolvasása

Először meg kell nyitnunk a fájlt az fopen paranccsal

azon=fopen('enadataim.csv','r')
azon =

     3

r jelentése: csak olvasásra nyitjuk meg. A beolvasott fájlt meg is jeleníthetjük:

type enadataim.csv
0.42289,0.7788,0.25479,0.17587,0.64762,0.58225,0.40458,0.34771,0.82172,0.51442,0.85071,0.73864,0.55229,0.12393,0.73784,0.55903,0.17812,0.89494,0.63107,0.69253
0.094229,0.42345,0.22404,0.72176,0.67902,0.54074,0.44837,0.15,0.42992,0.88428,0.56056,0.58599,0.62988,0.49036,0.063405,0.8541,0.35963,0.071453,0.089892,0.55667
0.59852,0.090823,0.66783,0.47349,0.63579,0.86994,0.36582,0.58609,0.88777,0.58803,0.92961,0.24673,0.031991,0.853,0.86044,0.34788,0.056705,0.24249,0.080862,0.39652
0.47092,0.26647,0.84439,0.15272,0.94517,0.26478,0.7635,0.26215,0.39118,0.15475,0.69667,0.66642,0.61471,0.87393,0.93441,0.44603,0.52189,0.053754,0.77724,0.061591
0.69595,0.15366,0.34446,0.34112,0.20893,0.31807,0.6279,0.044454,0.76911,0.19986,0.58279,0.083483,0.36241,0.27029,0.9844,0.054239,0.33585,0.44172,0.90513,0.78018
0.69989,0.28101,0.78052,0.60739,0.70928,0.11921,0.77198,0.75493,0.39679,0.40695,0.8154,0.62596,0.049533,0.20846,0.85894,0.17711,0.17567,0.013283,0.53377,0.33758
0.63853,0.44009,0.67533,0.19175,0.23623,0.93983,0.93285,0.24279,0.80851,0.74871,0.87901,0.66094,0.48957,0.56498,0.78556,0.66281,0.20895,0.89719,0.10915,0.60787
0.033604,0.52714,0.0067153,0.73843,0.1194,0.64555,0.97274,0.4424,0.75508,0.82558,0.98891,0.72975,0.19251,0.64031,0.51338,0.33083,0.90515,0.19666,0.82581,0.74125
0.068806,0.45742,0.60217,0.24285,0.6073,0.47946,0.19203,0.6878,0.3774,0.78996,0.00052238,0.89075,0.12308,0.41703,0.1776,0.89849,0.67539,0.093371,0.3381,0.10481
0.3196,0.87537,0.38677,0.91742,0.45014,0.63932,0.13887,0.35923,0.21602,0.31852,0.86544,0.9823,0.20549,0.20598,0.39859,0.11816,0.46847,0.30737,0.29397,0.12789
0.53086,0.51805,0.91599,0.26906,0.45873,0.54472,0.69627,0.73634,0.79041,0.53406,0.61257,0.76903,0.14651,0.94793,0.13393,0.98842,0.91213,0.45606,0.74631,0.54954
0.65445,0.94362,0.0011511,0.7655,0.66194,0.64731,0.09382,0.39471,0.9493,0.089951,0.98995,0.58145,0.18907,0.082071,0.03089,0.53998,0.10401,0.10167,0.010337,0.48523
0.40762,0.63771,0.46245,0.18866,0.77029,0.54389,0.5254,0.68342,0.32757,0.11171,0.52768,0.92831,0.042652,0.10571,0.93914,0.70692,0.74555,0.99539,0.048447,0.89048
0.81998,0.95769,0.42435,0.2875,0.35022,0.72105,0.53034,0.70405,0.67126,0.13629,0.47952,0.58009,0.6352,0.14204,0.30131,0.99949,0.73627,0.33209,0.66792,0.79896
0.71836,0.24071,0.46092,0.091113,0.66201,0.5225,0.86114,0.44231,0.43864,0.67865,0.80135,0.016983,0.28187,0.16646,0.29553,0.28785,0.56186,0.29735,0.60347,0.73434
0.96865,0.67612,0.77016,0.57621,0.41616,0.9937,0.48485,0.019578,0.8335,0.49518,0.22784,0.12086,0.5386,0.62096,0.33294,0.41452,0.18419,0.062045,0.5261,0.051332
0.53133,0.28906,0.32247,0.68336,0.84193,0.21868,0.39346,0.33086,0.76885,0.18971,0.49809,0.86271,0.69516,0.57371,0.46707,0.46484,0.59721,0.29824,0.72971,0.072885
0.32515,0.67181,0.78474,0.54659,0.83292,0.1058,0.67143,0.42431,0.16725,0.49501,0.90085,0.4843,0.49912,0.052078,0.6482,0.76396,0.29994,0.046351,0.70725,0.088527
0.10563,0.69514,0.47136,0.42573,0.25644,0.1097,0.74126,0.27027,0.86198,0.14761,0.57466,0.84486,0.5358,0.9312,0.025228,0.8182,0.13412,0.50543,0.78138,0.79835
0.61096,0.067993,0.035763,0.64444,0.61346,0.063591,0.52005,0.19705,0.98987,0.054974,0.84518,0.20941,0.44518,0.72866,0.84221,0.10022,0.2126,0.76143,0.28798,0.94301

vagy feldolgozhatjuk, az fgets beolvas egy sort sztringként, és lép egyet a következő sorra

sor=fgets(azon)
sor =

    '0.42289,0.7788,0.25479,0.17587,0.64762,0.58225,0.40458,0.34771,0.82172,0.51442,0.85071,0.73864,0.55229,0.12393,0.73784,0.55903,0.17812,0.89494,0.63107,0.69253
     '

Ez most egy sztring, de átalakíthatjuk lebegőpontos számmá

a=str2num(sor)
a =

  Columns 1 through 7

    0.4229    0.7788    0.2548    0.1759    0.6476    0.5823    0.4046

  Columns 8 through 14

    0.3477    0.8217    0.5144    0.8507    0.7386    0.5523    0.1239

  Columns 15 through 20

    0.7378    0.5590    0.1781    0.8949    0.6311    0.6925

Így lehet az egész fájlon végigmenni:

while ischar(sor) % amíg a fájl végére nem érünk
    fprintf('%s',sor);
    sor=fgets(azon);
end
0.42289,0.7788,0.25479,0.17587,0.64762,0.58225,0.40458,0.34771,0.82172,0.51442,0.85071,0.73864,0.55229,0.12393,0.73784,0.55903,0.17812,0.89494,0.63107,0.69253
0.094229,0.42345,0.22404,0.72176,0.67902,0.54074,0.44837,0.15,0.42992,0.88428,0.56056,0.58599,0.62988,0.49036,0.063405,0.8541,0.35963,0.071453,0.089892,0.55667
0.59852,0.090823,0.66783,0.47349,0.63579,0.86994,0.36582,0.58609,0.88777,0.58803,0.92961,0.24673,0.031991,0.853,0.86044,0.34788,0.056705,0.24249,0.080862,0.39652
0.47092,0.26647,0.84439,0.15272,0.94517,0.26478,0.7635,0.26215,0.39118,0.15475,0.69667,0.66642,0.61471,0.87393,0.93441,0.44603,0.52189,0.053754,0.77724,0.061591
0.69595,0.15366,0.34446,0.34112,0.20893,0.31807,0.6279,0.044454,0.76911,0.19986,0.58279,0.083483,0.36241,0.27029,0.9844,0.054239,0.33585,0.44172,0.90513,0.78018
0.69989,0.28101,0.78052,0.60739,0.70928,0.11921,0.77198,0.75493,0.39679,0.40695,0.8154,0.62596,0.049533,0.20846,0.85894,0.17711,0.17567,0.013283,0.53377,0.33758
0.63853,0.44009,0.67533,0.19175,0.23623,0.93983,0.93285,0.24279,0.80851,0.74871,0.87901,0.66094,0.48957,0.56498,0.78556,0.66281,0.20895,0.89719,0.10915,0.60787
0.033604,0.52714,0.0067153,0.73843,0.1194,0.64555,0.97274,0.4424,0.75508,0.82558,0.98891,0.72975,0.19251,0.64031,0.51338,0.33083,0.90515,0.19666,0.82581,0.74125
0.068806,0.45742,0.60217,0.24285,0.6073,0.47946,0.19203,0.6878,0.3774,0.78996,0.00052238,0.89075,0.12308,0.41703,0.1776,0.89849,0.67539,0.093371,0.3381,0.10481
0.3196,0.87537,0.38677,0.91742,0.45014,0.63932,0.13887,0.35923,0.21602,0.31852,0.86544,0.9823,0.20549,0.20598,0.39859,0.11816,0.46847,0.30737,0.29397,0.12789
0.53086,0.51805,0.91599,0.26906,0.45873,0.54472,0.69627,0.73634,0.79041,0.53406,0.61257,0.76903,0.14651,0.94793,0.13393,0.98842,0.91213,0.45606,0.74631,0.54954
0.65445,0.94362,0.0011511,0.7655,0.66194,0.64731,0.09382,0.39471,0.9493,0.089951,0.98995,0.58145,0.18907,0.082071,0.03089,0.53998,0.10401,0.10167,0.010337,0.48523
0.40762,0.63771,0.46245,0.18866,0.77029,0.54389,0.5254,0.68342,0.32757,0.11171,0.52768,0.92831,0.042652,0.10571,0.93914,0.70692,0.74555,0.99539,0.048447,0.89048
0.81998,0.95769,0.42435,0.2875,0.35022,0.72105,0.53034,0.70405,0.67126,0.13629,0.47952,0.58009,0.6352,0.14204,0.30131,0.99949,0.73627,0.33209,0.66792,0.79896
0.71836,0.24071,0.46092,0.091113,0.66201,0.5225,0.86114,0.44231,0.43864,0.67865,0.80135,0.016983,0.28187,0.16646,0.29553,0.28785,0.56186,0.29735,0.60347,0.73434
0.96865,0.67612,0.77016,0.57621,0.41616,0.9937,0.48485,0.019578,0.8335,0.49518,0.22784,0.12086,0.5386,0.62096,0.33294,0.41452,0.18419,0.062045,0.5261,0.051332
0.53133,0.28906,0.32247,0.68336,0.84193,0.21868,0.39346,0.33086,0.76885,0.18971,0.49809,0.86271,0.69516,0.57371,0.46707,0.46484,0.59721,0.29824,0.72971,0.072885
0.32515,0.67181,0.78474,0.54659,0.83292,0.1058,0.67143,0.42431,0.16725,0.49501,0.90085,0.4843,0.49912,0.052078,0.6482,0.76396,0.29994,0.046351,0.70725,0.088527
0.10563,0.69514,0.47136,0.42573,0.25644,0.1097,0.74126,0.27027,0.86198,0.14761,0.57466,0.84486,0.5358,0.9312,0.025228,0.8182,0.13412,0.50543,0.78138,0.79835
0.61096,0.067993,0.035763,0.64444,0.61346,0.063591,0.52005,0.19705,0.98987,0.054974,0.84518,0.20941,0.44518,0.72866,0.84221,0.10022,0.2126,0.76143,0.28798,0.94301

A végén be kell zárni a fájlt

fclose(azon);

Ha írni szeretnénk a fájlba, akkor ezt a megnyitáskor kell jelezni

azon=fopen('enadataim2.txt','w');
A=rand(20);

for i=1:20
    for j=1:20
        fprintf(azon,'%d \n',A(i,j));
    end
end

fclose(azon);

Órai feladatok

1. feladat: Írjunk egy olyan szundi() nevű függvényt, amelyet meghívva kiírja az eddigi meghívások számát. Ha viszont több mint 5-ször hívtuk meg, akkor csak annyit írjon ki a képernyőre, hogy 'ébresztő'. A függvénynek ne legyen kimenete.

2. feladat: Írjunk olyan függvényt, amely visszaadja az összes eddigi meghívásakor bementeként kapott számok átlagát.

3.feladat: Írjunk olyan függvényt, amelynek bemenete egy sztring. A függvény nyissa meg az ilyen nevű fáljt, majd olvassa ki a benne tárolt összes számot. Tudjuk, hogy a fájlban szereplő számok mind egészek, egy sorban egy szám van, a fájlban a számokon kívűl nincs más látható karakter. A fájlról feltehetjük, hogy megtalálható a munkakönyvtárban. A függvény visszatérési értéke legyen a számok átlaga és szórása.

4. feladat: Írjunk olyan filed(s) nevű függvényt, melynek bemenete egy txt fájl teljes neve sztring- ként. Ebben a fájlban csak egész számok vannak, soronként azonos, de ismeretlen darabszámú. Olvassuk be egy megfelelő méretű mátrixba a számokat, majd konver- táljuk a legkisebb helyet foglaló olyan egész típussá a mátrixot, melybe még adat- vesztés nélkül elférnek. A kimenet legyen ezen mátrix.