16,554
社区成员
发帖
与我相关
我的任务
分享
'运算符方法*,返回两个矩阵之积
Public Overloads Shared Operator *(ByVal leftMat As VBMatrix, ByVal rightMat As VBMatrix) As VBMatrix
Dim rowLeft, colLeft, rowRight, colRight As Integer
rowLeft = leftMat.Row
colLeft = leftMat.Col
rowRight = rightMat.Row
colRight = rightMat.Col
If colLeft <> rowRight Then
MsgBox("矩阵相乘发生错误,原因:被乘矩阵的列应等于乘数矩阵的行!")
Return Nothing
End If
Dim multiMat As New VBMatrix(rowLeft, colRight)
Dim i, j, k As Integer
For i = 0 To rowLeft - 1
For j = 0 To colRight - 1
For k = 0 To colLeft - 1
multiMat.dblMatData(i, j) = multiMat.dblMatData(i, j) + _
leftMat.dblMatData(i, k) * rightMat.dblMatData(k, j)
Next k
Next j
Next i
Return multiMat
End Operator
'返回矩阵的转置
Public Function Trans() As VBMatrix
Dim TransMat As New VBMatrix(intCol, intRow)
Dim i, j As Integer
For i = 0 To intCol - 1
For j = 0 To intRow - 1
TransMat.Item(i, j) = Me.dblMatData(j, i)
Next j
Next i
Return TransMat
End Function
'返回矩阵逆
'采用的选全主元方法
Public Function Inv() As VBMatrix
If intCol <> intRow Then
MsgBox("待求逆的矩阵行列不相等!")
Return Nothing
End If
Dim i, j, k, vv As Integer
intRow = Me.intRow
Dim InvMat As New VBMatrix(intRow, intRow)
'复制矩阵
For i = 0 To intRow - 1
For j = 0 To intRow - 1
InvMat.Item(i, j) = Me.Item(i, j)
Next j
Next i
Dim MainRow(intRow - 1), MainCol(intRow - 1) As Integer '用于记录主元素的行和列
Dim dblMainCell As Double '主元元素的值
Dim dblTemp As Double '临时变量
For k = 0 To intRow - 1
dblMainCell = 0
'选全主元
For i = k To intRow - 1
For j = k To intRow - 1
dblTemp = Math.Abs(InvMat.Item(i, j))
If (dblTemp > dblMainCell) Then
dblMainCell = dblTemp
MainRow(k) = i
MainCol(k) = j
End If
Next j
Next i
If Math.Abs(dblMainCell) < 0.0000000000001 Then '矩阵秩亏,不能求逆
MsgBox("矩阵秩亏", vbOKOnly, "")
Return Nothing
End If
If MainRow(k) <> k Then '交换行
For j = 0 To intRow - 1
vv = MainRow(k)
dblTemp = InvMat.Item(k, j)
InvMat.Item(k, j) = InvMat.Item(vv, j)
InvMat.Item(vv, j) = dblTemp
Next j
End If
If MainCol(k) <> k Then '交换列
For i = 0 To intRow - 1
vv = MainCol(k)
dblTemp = InvMat.Item(i, k)
InvMat.Item(i, k) = InvMat.Item(i, vv)
InvMat.Item(i, vv) = dblTemp
Next i
End If
InvMat.Item(k, k) = 1.0# / InvMat.Item(k, k) '计算乘数
For j = 0 To intRow - 1 '计算主行
If j <> k Then
InvMat.Item(k, j) = InvMat.Item(k, j) * InvMat.Item(k, k)
End If
Next j
For i = 0 To intRow - 1 '消元
If i <> k Then
For j = 0 To intRow - 1
If j <> k Then
InvMat.Item(i, j) = InvMat.Item(i, j) - InvMat.Item(i, k) * InvMat.Item(k, j)
End If
Next j
End If
Next i
For i = 0 To intRow - 1 '计算主列
If i <> k Then
InvMat.Item(i, k) = -InvMat.Item(i, k) * InvMat.Item(k, k)
End If
Next i
Next k
For k = intRow - 1 To 0 Step -1
If MainCol(k) <> k Then '交换行
For j = 0 To intRow - 1
vv = MainCol(k)
dblTemp = InvMat.Item(k, j)
InvMat.Item(k, j) = InvMat.Item(vv, j)
InvMat.Item(vv, j) = dblTemp
Next j
End If
If MainRow(k) <> k Then '交换列
For i = 0 To intRow - 1
vv = MainRow(k)
dblTemp = InvMat.Item(i, k)
InvMat.Item(i, k) = InvMat.Item(i, vv)
InvMat.Item(i, vv) = dblTemp
Next i
End If
Next k
Return InvMat
End Function
Private dblMatData(,) As Double '二维数组,用于存储矩阵中的元素
Private intRow As Integer '行
Private intCol As Integer '列
Public Sub New(ByVal row As Integer, ByVal col As Integer)
dblMatData = New Double(row - 1, col - 1) {}
intRow = row
intCol = col
End Sub
'Default表示该属性为缺省属性,Item根据行列返回或设置矩阵中的元素
'注意行和列都从0开始
Default Public Property Item(ByVal row As Integer, ByVal col As Integer) As Double
Get
Return dblMatData(row, col)
End Get
Set(ByVal value As Double)
dblMatData(row, col) = value
End Set
End Property
'只读属性,返回矩阵的行
Public ReadOnly Property Row() As Integer
Get
Return intRow
End Get
End Property
'只读属性,返回矩阵的列
Public ReadOnly Property Col() As Integer
Get
Return intCol
End Get
End Property