2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 двумерные массивы в VBA
Сообщение17.05.2011, 19:58 


08/11/10
20
помогите пожалуйста с задачей: заданы две матрицы B(4,4) и D(3,3). написать программу транспонирования каждой из данных матриц с последующим перемножением транспонированной матрицы на соответствующую ей исходную. причем в программе нужно использовать подпрограмму( т.е. function). я вот попробовал написать но никакого результата почему-то. буду благодарен за помощь


Sub макрос()
Dim B(4, 4) As Integer 'матрица Â
Dim BB(16) As Integer 'матрица А разложенная в одномерный массив
Dim BT(4, 4) As Integer 'транспонированная матрица Â
Dim D(3, 3) As Integer
Dim DD(9) As Integer
Dim DT(3, 3) As Integer
Dim BBT(4, 4) As Integer матрица - произведение матрицы В на транспонированную матрицу В
Dim DDT(3, 3) As Integer
Dim z As Integer 'переменная для заполнения одномерного массива

'задание матриц
Randomize
For i = 1 To 4
For j = 1 To 4
B(i, j) = ((Rnd * 10) + 1)
Cells(i, j) = B(i, j)
Next j
Next i

Randomize
For i = 1 To 3
For j = 1 To 3
D(i, j) = ((Rnd * 10) + 1)
Cells(i, j + 5) = D(i, j)
Next j
Next i


'транспонирование B

z = 0
For i = 1 To 4
For j = 1 To 4
BB(z) = B(i, j)
index = index + 1
Next j
Next i

z = 0
For i = 1 To 4
For j = 1 To 4
BT(j, i) = BB(z)
z = z + 1
Next j
Next i
Cells(i + 6, j) = BT(j - 1, i - 1)


'транспонирование D

z = 0
For i = 1 To 3
For j = 1 To 3
DD(z) = D(i, j)
z = z + 1
Next j
Next i

z = 0
For i = 1 To 3
For j = 1 To 3
DT(j, i) = DD(z)
z = z + 1
Next j
Next i

Cells(i + 6, j + 5) = DT(j - 1, i - 1)

'умножение матриц
For i = 1 To 4
For j = 1 To 4
For k = 1 To 4
BBT(i, j) = BBT(i, j) + B(i, k) * BT(k, j)
Next k
Next j
Next i
Cells(i + 10, j) = BBT(i - 1, j - 1)

For i = 1 To 3
For j = 1 To 3
For k = 1 To 3
DDT(i, j) = DDT(i, j) + D(i, k) * DT(k, j)
Next k
Next j
Next i
Cells(i + 10, j) = DDT(i - 1, j - 1)

End Sub

 Профиль  
                  
 
 Re: двумерные массивы в VBA
Сообщение19.05.2011, 16:34 
Заслуженный участник


26/07/09
1559
Алматы
2Ninja
Ошибка в использовании index = index + 1 вместо z=z+1 при транспонировании. На самом деле, непонятно, зачем вы производите "линеаризацию" матрицы, достаточно написать:
Используется синтаксис Visual Basic
For i = 1 To 4
    For j = 1 To 4
        BT(j, i) = B(i, j)
    Next j
Next i
 

Аналогично для D -> DT (т.е. массивы BB и DD можно выкинуть).

Кстати, удостоверьтесь в правильной индексации элементов массива, уж не с нуля ли она идет по-умолчанию? На всякий случай можно объявлять матрицы как Dim B(1 To 4, 1 To 4) As Integer.

Далее. Я не знаю, как basic по-умолчанию инициализирует массивы, но в любом случае не помешало бы явно забивать все элементы матриц BBT и DDT нулями.

С Cells вы там тоже что-то нахимичили, но это не страшно.

Насчет функций. Вам наверное надо транспонирование и умножение оформить в виде отдельных функций, да?

Транспонирование может выглядеть как-то так:
код: [ скачать ] [ спрятать ]
Используется синтаксис Visual Basic
Function Transpose(Source() As Integer) As Integer()
    Dim LastRow As Integer
    Dim FirstRow As Integer
    Dim LastColumn As Integer
    Dim FirstColumn As Integer
   
    LastRow = UBound(Source, 1)
    FirstRow = LBound(Source, 1)
    LastColumn = UBound(Source, 2)
    FirstColumn = LBound(Source, 2)
   
    Dim Result() As Integer
    ReDim Result(FirstRow To LastRow, FirstColumn To LastColumn)
   
    For i = FirstRow To LastRow
        For j = FirstColumn To LastColumn
            Result(j, i) = Source(i, j)
        Next j
    Next i
   
    Transpose = Result
End Function

...

Sub RunThis()
    Dim B(1 To 4, 1 To 4) As Integer
    Dim BT() As Integer
    ReDim BT(1 To 4, 1 To 4)
   
    BT = Transpose(B)
End Sub
 


Здесь для хранения результата и для его возвращение функцией Transpose используется динамический массив (без указания размерности при объявлении).

По-аналогии, вы можете написать функцию умножения двух матриц.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group