高手帮忙~~求一个矩阵转置、求逆、相乘的VB.NET代码

qq136187193 2011-05-25 04:35:36
RT
...全文
411 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
csuchen6 2011-05-30
  • 打赏
  • 举报
回复
怎么还没结贴,难道还不满意 ?
麒皑鹭 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 csuchen6 的回复:]

这个我写过,给你了。
VB.NET code

[/Quote]

VBMatrix 的定义呢? 也贴出来吧
csuchen6 2011-05-27
  • 打赏
  • 举报
回复
这个我写过,给你了。

'运算符方法*,返回两个矩阵之积
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


麒皑鹭 2011-05-27
  • 打赏
  • 举报
回复
不错,支持一下
csuchen6 2011-05-27
  • 打赏
  • 举报
回复
灰常清楚了哦
csuchen6 2011-05-27
  • 打赏
  • 举报
回复

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
Friday 2011-05-25
  • 打赏
  • 举报
回复
如果你能整理下这些数学问题,先转成一些对应的步骤要求的话会好点,因为会编程的人不一定数学会很好,你总不会叫别人先学数学再答你的问题。。。
v_yao 2011-05-25
  • 打赏
  • 举报
回复
帮顶接分!

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧