2014 dxdy logo

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

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




 
 двумерные массивы в VBA
Сообщение17.05.2011, 19:58 
помогите пожалуйста с задачей: заданы две матрицы 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 
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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group