|
Пример 4.8.2-9. Написать процедуру, которая из матрицы х(n,m), являющейся входным параметром, получает транспонированную к ней матрицу y(m, n).
Алгоритм и процедура приведены на рис. 4.8.2-9.
Для решения поставленной задачи в алгоритме необходимо реализовать вложенные циклы перебора всех элементов исходной матрицы х(,). Транспонирование матрицы осуществляется путем перестановки (обмена) индексов транспонированной матрицы по отношению к исходной.
| Sub Pr829(ByRef x(,) As Single, _
ByRef y(,) As Single)
Dim ArrayRank, n, m, j, i As Integer
ArrayRank = x.Rank
n = x.GetLength(ArrayRank - 2) - 1
m = x.GetLength(ArrayRank - 1) - 1
ReDim y(m,n)
For i = 0 To n
For j = 0 To m
y(j,i) = x(i,j)
Next j
Next i
End Sub
|
Рис. 4.8.2-9. Программный код процедуры Pr829()
Примера 4.8.2-9
Пример 4.8.2-10.Написать процедуру, которая вычисляет алгебраическое произведение матрицы х(n,m) на матрицу y(m,n).
Алгоритм и процедура решения задачи представлены на рис. 4.8.2-10.
Произведением матрицы x(n,m) на матрицу y(m,k) называется матрица p(m,k), в которой элемент, стоящий на пересечении i -й строки и j -го столбца, равен произведению i -го вектора-строки матрицы x(n,m) на j -й вектор-столбец матрицы y(m,k).
Произведением вектора-строки a(n) на вектор-столбец b с одинаковым числом элементов n называется сумма произведений соответствующих элементов этих векторов . Таким образом, произведение двух матриц можно записать следующим образом:

| Sub Pr8210(ByRef x(,) As Single _
ByRef y(,) As Single _
ByRef p(,) As Single)
Dim nx, mx, ky, j, i, k As Integer
Dim XRank, YRank As Integer
Dim s As Single
XRank = x.Rank: YRank = y.Rank
mx = x.GetLength(0)- 1
nx = x.GetLength(1)- 1
ny = y.GetLength(0)- 1
ky = y.GetLength(1)- 1
If XRank=2 And YRank=2 And nx=ny Then
ReDim p(mx,ky)
For i = 0 To mx
For j = 0 To ky
s = 0
For k = 0 To nx
S = s + x(i,k) * y(k,j)
Next k
p(i,j)= s
Next j
Next i
vivodSngMac19(p, ListBox1)
Else
TextBox1.Text="Проверь размерности"
End If
End Sub
|
Рис. 4.8.2-10. Программный код процедуры Pr8210()
Примера 4.8.2-10
Для формирования такой матрицы необходимо организовать вложенные циклы: внешний цикл, изменяющий номер строки от 0 до m, и внутренний цикл, изменяющий номер столбца от 0 до k. Для вычисления произведения текущей строки матрицы x(i,t) на текущий столбец матрицы y(t,j) в теле внутреннего цикла требуется еще один цикл, параметр которого меняется от 0 до n.
На рис. 4.8.2-10 представлен общий алгоритм вычисления алгебраического произведения двух матриц размерами (mx*nx) и (nx*ky). В программу добавлена проверка на соответствие количества столбцов первой матрицы количеству строк второй матрицы, причем в схеме алгоритма она отсутствует.
Пример 4.8.2-11. Создать проект, в котором формируется двумерный массив x, состоящий из четырех строк и четырех столбцов, по правилу: x(i,j)=2*(i-2)2-(j-2)2, а затем определяется максимальный элемент среди элементов, лежащих ниже главной диагонали, а также минимальный элемент, расположенный выше главной диагонали. Найденные максимальный и минимальный элементы необходимо поменять местами.
Формирование значений элементов двумерного массива x(,) по заданной формуле и их вывод в виде матрицы производятся с помощью вложенных циклов. В переменных xmin и xmax в цикле фиксируются минимальный и максимальный элементы массива, в переменных imin, jmin и imax, jmax – их координаты (номер строки и номер столбца).
Программный код проекта представлен на рис. 4.8.2-11.
| Option Strict On
Option Explicit On
Public Class Form1
'Формирование двумерного массива x(,)
Sub Form(ByRef x(,) As Single)
Dim i, j, m As Integer
m = x.GetLength(0) - 1
For i = 0 To m
For j = 0 To m
x(i, j) = CSng(2 * (i - 2) ^ 2 - (j - 2) ^ 2)
Next
Next
End Sub
'Процедура форматного вывода двумерного массива в ListBox
Sub vivod1(ByRef x(,) As Single, ByRef LB As ListBox)
Dim i, j, m, n As Integer
Dim z, z1 As String
m = x.GetLength(0) – 1: n = x.GetLength(1) - 1
LB.Items.Clear()
For i = 0 To m
z = ""
For j = 0 To n
z1 = Format(x(i, j),"0.000")
If x(i, j) < 0 Then
z1 = Space(2) + z1
Else
z1 = Space(3) + z1
End If
z = z + z1
Next
LB.Items.Add(z)
Next
End Sub
'Процедура вывода результата в TextBox
Sub vivod3(ByVal Z As Double, ByRef T As TextBox)
T.Text = CStr(Z)
End Sub
'Процедура вывода данных типа Integer в TextBox
Sub vivod4(ByVal Z As Integer, ByVal T As TextBox)
T.Text = CStr(Z)
End Sub
'Нахождение max элемента и его индексов,
'лежащих ниже главной диагонали
Sub MaxN(ByRef x(,) As Single, ByRef xmax As Single, _
ByRef imax As Integer, ByRef jmax As Integer)
Dim i, j, m As Integer
m = x.GetLength(0) - 1
imax = 1: jmax = 0: xmax = x(1, 0)
For i = 0 To m
For j = 0 To i - 1
If x(i, j) > xmax Then
xmax = x(i, j): imax = i: jmax = j
End If
Next
Next
End Sub
'Нахождение min элемента и его индексов,
'лежащих выше главной диагонали
Sub MinV(ByRef x(,) As Single, ByRef xmin As Single, _
ByRef imin As Integer, ByRef jmin As Integer)
Dim i, j, m As Integer
m = x.GetLength(0) - 1
imin = 0: jmin = 1: xmin = x(0, 1)
For i = 0 To m
For j = i + 1 To m
If x(i, j) < xmin Then
xmin = x(i, j): imin = i: jmin = j
End If
Next
Next
End Sub
'Обмен max и min элементов
Sub Ob(ByRef x(,) As Single, _
ByVal imax As Integer, ByVal jmax As Integer, _
ByVal imin As Integer, ByVal jmin As Integer)
Dim r As Single
r = x(imax, jmax): x(imax, jmax) = x(imin, jmin)
x(imin, jmin) = r
End Sub
'Основная процедура
Sub Pr8211(ByRef x(,) As Single, ByRef xmin As Single, _
ByRef xmax As Single)
Dim imin, jmin, imax, jmax As Integer
Form(x) 'Формирование двумерного массива x(,)
vivod1(x, ListBox1)
MaxN(x, xmax, imax, jmax)
vivod3(xmax, TextBox1)
vivod4(imax, TextBox2)
vivod4(jmax, TextBox3)
MinV(x, xmin, imin, jmin)
vivod3(xmin, TextBox4)
vivod4(imin, TextBox5)
vivod4(jmin, TextBox6)
Ob(x, imax, jmax, imin, jmin)
vivod1(x, ListBox2) 'Вывод преобразованного массива
End Sub
Private Sub Button1_Click(sender As Object, _
e As EventArgs) Handles Buton1.Click
Dim xx(3, 3) As Single
Dim xm1, xm2 As Single
Pr8211(xx, xm1, xm2)
End Sub
End Class
|
Рис. 4.8.2-11. Программный код проекта Пример 4.8.2-11
4.8.3. Тестовые задания
Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|