Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Циклический сдвиг.DOC
Скачиваний:
6
Добавлен:
21.12.2018
Размер:
302.08 Кб
Скачать

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], ij.

Причому для індексів елементів над головною диагоналлю повинно виконуватись наступне співвідношення : 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

Перевага алгоритму - не потрібна додаткова перевірка на парність або непарність розмірності матриці.