8.5. Деякі алгоритми для кавдратних матриць
1. Обробка диагональних елементів. Знайти суму елементів на головній діагоналі. Ознакою того, що елементи знаходяться на головній діагоналі, є умова i=j, отже не потрібно вводити окремі цикли по кожній з індексних змінних
|Matr1
1 n
1 А є R
m
i,n, є N
S є R
введення n,А
S:=0;
(i=1,n)
S:=S+ A[i,i]
Виведення: S
|end
2. Знайти суму елементів на побічній діагоналі
Ознакою того, що елементи aij знаходяться на побічній діагоналі, є наступна залежність між індексами:
i+j=n+1
тоді
j=n-i+1 або i=n-j+1
Отже, для обчислення шуканої суми нам також достатньо одного циклу по будь-якому з індексів.
|Matr1
1 n
a є R
m
i,n, є N
S є R
введення n,a -1
S:=0;
(i=1,n) (j=n,1)
S:=S+ A[i,n-i+1] S:=S+ A[n-j+1,j];
виведення S
|end
3. Транспонування матриці.
При транспонуванні матриці достатньо обійти елементи матриці над головною диагональю і замінити їх місцями з відповідними елементами під головною діагоналлю
A[i,j] A[j,i], ij.
Причому для індексів елементів над головною диагоналлю повинно виконуватись наступне співвідношення : j>=i+1.
Елементи на диагоналі не змінюються.
|Matr1
1 n
1 A є R
m
i,n,j є N
B є R
введення n,B
(i=1,n-1)
(j=i+1,n)
B:=A[i,j]
A[i,j]:=A[j,i]
A[j,i]:=B
Виведення: A
|end
4. Обхід матриці по спиралі
(може бути реалізований не тількі для квадратних матриць, але в цьому випадку алгоритм виглядає трохи складніше)
1 n
n
а) симетричний алгоритм обходу матриці
Виділимо всередені матриці вкладені кільця і будемо їх послідовно обходити, від зовнішнього кільця до внутрішнього, способом, що його показано на малюнку.
j=p j=n-p+1
i=p Кільце з нумером p
i=n-p+1
Пронумеруємо кільця від зовнішнього кільця до внутрішнього. На малюнку показані зміни індексів при пересуванні по рядку та стовбцю для довільного p - го кільця. Загальне число кілець дорівнює n div 2.
Причому для матриць з n-парною, кількість елементів у самому внутрішньому кільці дорівнює 4, а для n-непарної - одному.
|sym
1 n
a є R
m
i,n,j,p є N
B є R
введення n,A
(p=1,[n/2])
(j=p,n-p)
виведення A[p,j]
(i=p,n-p)
виведення A[i,n-p+1]
-1
(j=n-p+1,p+1)
виведення A[n-p+1,j]
-1
(i=n-p+1,p+1)
виведення A[i,p]
(n mod 20)
виведення A[(n+1)/2,(n+1)/2]
|end
б) Несиметричний обхід
Порядок обходу і діапазони зміни індексів у випадку несиметричного обходу показані на малюнку.
j=p j=n-p+1
i=p
i=n-p+1
Алгоритм має наступний вигляд:
|sym
A є R
i,n,j,p є N
B є R
введення n,A
(p=1,(n+1) div 2)
(j=p,n-p+1)
виведення A[p,j]
(i=p+1,n-p+1)
виведення A[i,n-p+1]
-1
(j=n-p,p)
виведення A[n-p+1,j]
-1
(i=n-p,p+1)
виведення A[i,p]
|end
Перевага алгоритму - не потрібна додаткова перевірка на парність або непарність розмірності матриці.