1
Laboratorium komputerowe 4 – przykładowe rozwiązania
zad. 1.
a)
n = 5; % liczba wierszy macierzy m = 5; % liczba kolumn macierzy a = -10;
b = 10;
R = round((b-a)*rand(n,m)+a);
s = 0; % suma elementów dodatnich N = 0; % liczba elementów dodatnich
for i=1:n % przechodzimy po wszystkich wierszach for j=1:m % i dla każdego wiersza po wszystkich
% kolumnach
if R(i,j) > 0 % sprawdzamy element macierzy s = s + R(i,j); % dodajemy el. do sumy N = N + 1; % zwiększamy liczbę el.
end end
end
Np = N/(n*m)*100; % udział procentowy elementów dodatnich disp('Suma elementow dodatnich: ');
disp(s);
disp('Udzial procentowy elementow dodatnich: ');
disp(Np);
Uwaga:
Macierz R jest macierzą pseudolosową, dlatego za każdym razem uzyskamy inne wyniki (dla mniejszych macierzy warto dodatkowo wyświetlić jak wygląda wygenerowana macierz i sprawdzić, czy wszystko dobrze działa). Im więcej jest elementów w macierzy R, tym mniejszy jest rozrzut w otrzymywanym udziale procentowym Np.
Proszę uruchomić powyższy skrypt wielokrotnie, dla różnych parametrów n, m, a, b, zgodnie z propozycjami w tematach zadań.
Fragment w ramce zostanie wykorzystany do zdefiniowanie funkcji (podpunkt b).
2
function [s Np] = macierzdodatnie(A)
[n m] = size(A);
s = 0;
N = 0;
for i = 1:n for j = 1:m
if A(i,j) > 0
s = s + A(i,j);
N = N + 1;
end
end end
Np = N/(n*m)*100;
end
Uwaga:
Sprawdzić funkcje dla wybranych macierzy. Przykładowo, zdefiniować w Command Window dowolną macierz i wywołać dla niej funkcje:
B = [3 1 2 3; 1 -2 -3 1; -2 1 0 1]
[suma proc] = macierzdodatnie(B)
3 zad. 2.
a)
function s = normamacierzy1(A)
[n,m] = size(A); % odczytujemy rozmiar macierzy
s = 0;
for i=1:n for j=1:m
s = s + A(i,j)*A(i,j);
end end
s = sqrt(s);
end
b)
function s = normamacierzy2(A) s = sqrt(sum(sum(A.*A)));
end
Uwaga:
Sprawdzić obydwie funkcje dla tej samej macierzy. Przykładowo, zdefiniować w Command Window dowolną macierz i wywołać dla niej obydwie funkcje. Powinno się uzyskać taki sam wynik.
A=[3 1 2 3; 1 -2 -3 1; 2 1 0 1]
normamacierzy1(A) normamacierzy2(A) wynik: 6.6332
4 a)
function s = sumapodprzekatna(A)
[n,m] = size(A); % odczytujemy rozmiar macierzy s = 0; % suma elementów
if n==m % sprawdzamy, czy macierz jest kwadratowa for i=1:n % i – numer wiersza
for j=1:m % j – numer kolumny
if i>j % warunek na elementy pod
% przekątna s = s + A(i,j);
end
end end
else
disp('Podana macierz nie jest kwadratowa');
end end
b)
Fragment w ramce zastępujemy poniższym (zmieniamy zakresy pętli, aby odczytać tylko te elementy, które znajdują się pod przekątną; instrukcja warunkowa nie jest już potrzebna):
for i=2:n % i – numer wiersza for j=1:i-1 % j – numer kolumny
s = s + A(i,j);
end end
Uwaga:
W przypadku a) funkcja wykonuje n2 iteracji (zakres obydwu pętli, zewnętrznej i wewnętrznej, jest taki sam; pętla zewnętrzna wykonuje n iteracji, a dla każdej iteracji pętli zewnętrznej pętla wewnętrzna również wykonuje n iteracji). W przypadku b) funkcja wykonuje (n2-n)/2 iteracji. Zweryfikować liczbę iteracji dla konkretnych macierzy (np. 3x3, 4x4, 5x5).
W ramach dodatkowego ćwiczenia zmodyfikować powyższą funkcję, aby sumowała:
c) elementy nad przekątną, d) elementy na przekątnej.
5 zad. 4.
function N = porownaniemacierzy(A,B) [n,m] = size(A);
[n2,m2] = size(B);
if n==n2 && m==m2 N = 0;
for i=1:n for j=1:m
if A(i,j)>B(i,j) N = N+1;
end
end end
else
disp('Macierze maja rozny rozmiar');
end end