function M = RandRel(m, n, prosenttiosuus); % satunnaisrelaatio RandRel.m: function M = RandRel(n,m,prosenttiosuus); % laskee ja tulostaa satunnaisen relaation matriisin, missä % m,n = matriisin koko, prosenttiosuus = ykkösten suhteellinen osuus apuM = rand(m,n); M = (apuM <= prosenttiosuus/100);
Matlabin käsky rand antaa tasaisesti välille [0, 1] jakautuneita lukuja. Normaalijakaumaa käyttää randn.Funktiossa siis generoidaan ensin satunnaismatriisi apuM, ja sen avulla logiikkamatriisi M niin, että saadaan (keskimäärin) prosenttiosuus ykkösiä. Jos tämä on esimerkiksi 20, niin ykkönen tulee niihin kohtiin, joissa luku on pienempi kuin 0.2. Talleta funktio kansioon X:\DISKREET\RELAATIO tyyliin File, Save As etc. b) Muodosta nyt funktiollasi RandRel 100×100-satunnaismatriisi, jossa on noin 30% ykkösiä. Laske sen ykkösien määrä Matlabin sum-käskyn avulla, sekä ykkösten todellinen prosentuaalinen osuus.
» MA = RandRel(100, 100, 30) » ykk = sum(sum(MA)) » ykk/10000
Mitä laskee käsky sum kohdistettuna matriisiin, mitä kaksinkertaisena?
» M = SatRel(7,10) % toimii kuten RandRel » PiirRel2(M) » PiirAlk2(M,[1,4],[6],'*b','*g') » PiirNuo2(M,[1,4],'-g') » M = zeros(7,10); PiirRel2(M) » PiirAlk2(M,[1,4],[6],'*b','*g') » PiirNuo2(M,[1,6;4,6],'--g') » M(1,6) = 1; M(4,6) = 1; PiirRel2(M)b) Muodosta Matlab-funktio LisaaNuo, joka sekä lisää nuolen matriisiin että piirtää sen kuvioon. Miten?
piirtofunktioita 1: function PiirRel1( M, vari); piirtofunktioita 1: function PiirAlk1( M, alkiot, vari); piirtofunktioita 1: function PiirNuo1(M, alkiopari, vari); piirtofunktioita 1: function PiirSilm( M, alkio, vari); lisäys ja piirto 1: function L = LisaNuo1(M, alkiopari, vari); poisto ja piirto 1: function L = PoisNuo1(M, alkiopari, uusi); (tee, jos ei ole ja tarviit!)Relaatioita R Í X×Y varten on vastaavat piirtofunktiot 2, ks. » help RELAATIO Suorita seuraavat käskyt ja vastaa kysymykseen:
» M = zeros(6) » PiirRel1(M) » M = LisaNuo1(M,[2,4]) » M = LisaNuo1(M,[4,6]) » M = LisaNuo1(M,[6,5]) » K = sign(M*M) » [I,J] = find(K) » N = [I,J] » N(1,:) » PiirNuo1(M,N(1,:),'-b') » PiirNuo1(M,N(2,:),'-b')Huomaatko mitään yhteyttä matriisin M ja K = M*M nuolilla?
» A = [0 0 0 1 1; 1 1 0 0 1; 0 0 1 0 0; 1 1 0 0 0; 0 0 0 0 0] » B = [0 1 0 0 0; 0 0 1 0 0; 1 0 0 0 0; 1 0 0 0 0; 0 1 0 0 1] » C = [0 0 0 0 0; 0 0 0 0 0; 1 0 1 0 1; 0 0 0 0 0; 1 0 0 1 1] » A, B, C » any(A(1,:) & B(:,2).') % Mitä tehdään » any(A(1,:) & B(:,3).') % näissä? __________________________ » T = zeros(5,5) » for i = 1:5 % paina enter nelosen perään! for j = 1:5 % samoin jne T(i,j) = any(A(i,:) & B(:,j)'); end; end; » T » T | CMitä yllä tehtiin?
» Nuolet(M) » Nuolet(K) » Nuolet(zeros(5))Mitä antaa Nuolet(zeros(5))?
b) Muodosta funktio BT, joka laskee ja palauttaa syötteenä
annettujen kahden logiikkamatriisin välisen matriisitulon Boolen operaatioilla.
Voit lainata koodia Tehtävästä 4.
Koeta sitten:
» A,B » BT(A,B) » BT(A,B) | COnko sama tulos kuin 4:ssä ja kotilaskussa 5/3. harjoitus?
» C = SatRel(3,4,20) » D = SatRel(4,5,20) » E = BT(C,D) » figure(1); PiirRel2(C) » figure(2); PiirRel2(D) » figure(3); PiirRel2(E)Kuvioihin liittyy nyt "kahva" (handle) 1, 2 tai 3. Muotoile kuviot niin, että 1 ja 2 ovat vierekkäin näytön yläreunassa ja 3 alareunassa. Tutki onko alempi nyt todella ylempien tulorelaatio?
b) Mitä relaation yhdistäminen oikein tekee? Kokeillaan:
» P = [0 0 1 1 0 % paina enter rivin viimeisen jälkeen 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1] » figure(1); PiirRel1(P) » P2 = BT(P,P), figure(2), PiirRel1(P2) » P3 = BT(P2,P), figure(3), PiirRel1(P3) » BT(P,P) <= P » PP = P|P2 » BT(PP,PP) <= PP » PP = P|P2|P3 » BT(PP,PP) <= PP » figure(4); PiirRel1(PP)Selitä, kuinka P:stä kehittyy lopullinen PP, ja mitä erikoista siinä on:
» M = SatRel(10,10,50) » diag(M) » all(diag(M)) » D = diag(diag(M)) » all(diag(D)) » S = M | eye(size(M)) » all(diag(S))Kirjoita Matlab-funktio ReflKo (viittaa kysymykseen "refleksiivinenkö"), joka palauttaa arvon 1, jos syötteenä annettua matriisia vastaava relaatio on refleksiivinen, ja muutoin arvon 0. Testaa sitä yllä määritellyillä matriiseilla M ja S.
b) Miten tarkastetaan Matlabissa kahden matriisin samuus?
c) Miten tarkastetaan Matlabissa onko relaatio toisen osajoukko?