VB有现成的矩阵类吗?比如能实现矩阵的求逆、转置、矩阵乘、求矩阵特征值等等运算.
VB有现成的矩阵类吗?比如能实现矩阵的求逆、转置、矩阵乘、求矩阵特征值等等运算.
VB有现成的矩阵类吗?比如能实现矩阵的求逆、转置、矩阵乘、求矩阵特征值等等运算.
VB有现成的矩阵类吗?比如能实现矩阵的求逆、转置、矩阵乘、求矩阵特征值等等运算.
我以前自己编过一些,求逆用的LU分解,转置比较简单,其他的还作了矩阵右除用的QR分解
代码比较丢人- - 那时候VB还是初学
下面放到模块里
Public Sub Matrix_LU(ByRef X() As Double,ByVal m As Integer,ByVal n As Integer,ByRef A() As Double,ByRef P() As Double)
Dim pp,Maxval,lutemp,ptemp
For i = 1 To m
For j = 1 To n
A(i,j) = X(i,j)
Next
Next
For i = 1 To m
P(i) = i
Next
For k = 1 To min(m - 1,n)
pp = k
Maxval = Abs(A(k,k))
For i = k + 1 To m
If Abs(A(i,k)) > Maxval Then
Maxval = Abs(A(i,k))
pp = i
End If
Next
If pp k Then
For C = 1 To n
lutemp = A(pp,C)
A(pp,C) = A(k,C)
A(k,C) = lutemp
Next
ptemp = P(k)
P(k) = P(pp)
P(pp) = ptemp
End If
If A(k,k) 0 Then
For i = k + 1 To m
A(i,k) = A(i,k) / A(k,k)
Next
For j = k + 1 To n
For i = k + 1 To m
A(i,j) = A(i,j) - A(i,k) * A(k,j)
Next
Next
End If
Next
End Sub
Public Sub Matrix_Inv(ByRef X() As Double,ByVal m As Integer,ByVal n As Integer,ByRef Y() As Double)
Dim Matrix_InvTemp(100,100) As Double
Dim Matrix_InvP(100) As Double
Matrix_LU X,m,n,Matrix_InvTemp,Matrix_InvP
For k = 1 To n
C = Matrix_InvP(k)
Y(k,C) = 1
For j = k To n
If Y(j,C) 0 Then
For i = j + 1 To n
Y(i,C) = Y(i,C) - Y(j,C) * Matrix_InvTemp(i,j)
Next
End If
Next
For j = n To 1 Step -1
Y(j,C) = Y(j,C) / Matrix_InvTemp(j,j)
If Y(j,C) 0 Then
For i = 1 To j - 1
Y(i,C) = Y(i,C) - Y(j,C) * Matrix_InvTemp(i,j)
Next
End If
Next
Next
End Sub
Public Sub Turn(ByRef A() As Double,ByVal m As Integer,ByVal n As Integer,ByRef B() As Double)
For i = 1 To n
For j = 1 To m
B(i,j) = A(j,i)
Next
Next
End Sub
Public Function Det(ByRef A() As Double,ByVal m As Integer) As Double
Det = 1
Dim DetTemp(100,100) As Double
Dim DetPTemp(100) As Double
Matrix_LU A,m,m,DetTemp,DetPTemp
For i = 1 To m
Det = Det * DetTemp(i,i)
Next
End Function
Public Sub MxM(ByRef A() As Double,ByRef B() As Double,ByVal m As Integer,ByVal mn As Integer,ByVal n As Integer,ByRef C() As Double)
Zeros C,m,n
For i = 1 To m
For j = 1 To n
For k = 1 To mn
C(i,j) = C(i,j) + A(i,k) * B(k,j)
Next
Next
Next
End Sub
Public Sub Zeros(ByRef z() As Double,ByVal X As Integer,ByVal Y As Integer)
' Zeros
' z():input array
' x,y:array subscript
Dim i,j
If Y = 0 Then
For i = 0 To X
z(i) = 0
Next
Else
For i = 0 To X
For j = 0 To Y
z(i,j) = 0
Next
Next
End If
End Sub
QR分解代码太长就不贴了反正上述功能也用不上
那时候不知道有Redim和UBound这回事,所以…………
用法:例如对A(m,n)进行计算,结果存在B(m,n)里
求逆:Matrix_Inv A,m,n,B
转置:Turn A,m,n,B
乘法:例如A(m,n) * B(n,k) 结果存在C(m,k)里
MxM A,B,m,n,k,C
求行列式值:Det(A,n)