ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5104|回复: 32

[分享] vb 矩阵计算程序(转载)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-5-30 16:51 | 显示全部楼层 |阅读模式
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  功能:  矩阵运算
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Option Explicit
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MatrixToString
'  功能:  将矩阵转换为显示字符串
'  参数:  m   - Integer型变量,矩阵的行数
'          n   - Integer型变量,矩阵的列数
'          mtxA  - Double型m x n二维数组,存放相加的左边矩阵
'          sFormat - 显示矩阵各元素的格式控制字符串
'  返回值:String型,显示矩阵的字符串
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MatrixToString(m As Integer, n As Integer, mtxA() As Double, sFormat As String) As String
    Dim i As Integer, j As Integer
    Dim s As String
    s = ""
    For i = 1 To m
        For j = 1 To n
            s = s + Format(mtxA(i, j), sFormat) + "  "
        Next j
        s = s + Chr(13)
    Next i
   
    MatrixToString = s
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MatrixColToString
'  功能:  将矩阵的指定列转换为显示字符串
'  参数:  m   - Integer型变量,矩阵的行数
'          c   - Integer型变量,要显示的矩阵的列数
'          mtxA  - Double型m x n二维数组,存放相加的左边矩阵
'          sFormat - 显示矩阵各元素的格式控制字符串
'  返回值:String型,显示矩阵指定的列向量
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MatrixColToString(m As Integer, c As Integer, mtxA() As Double, sFormat As String) As String
    Dim i As Integer, j As Integer
    Dim s As String
    s = ""
    For i = 1 To m
        s = s + Format(mtxA(i, c), sFormat) + "  "
    Next i
    MatrixColToString = s
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MAdd
'  功能:  计算矩阵的加法
'  参数:  m   - Integer型变量,矩阵的行数
'          n   - Integer型变量,矩阵的列数
'          mtxA  - Double型m x n二维数组,存放相加的左边矩阵
'          mtxB  - Double型m x n二维数组,存放相加的右边矩阵
'          mtxC  - Double型m x n二维数组,返回和矩阵
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MAdd(m As Integer, n As Integer, mtxA() As Double, mtxB() As Double, mtxC() As Double)
    Dim i As Integer, j As Integer
    For i = 1 To m
        For j = 1 To n
            mtxC(i, j) = mtxA(i, j) + mtxB(i, j)
        Next j
    Next i
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MSub
'  功能:  计算矩阵的减法
'  参数:  m   - Integer型变量,矩阵的行数
'          n   - Integer型变量,矩阵的列数
'          mtxA  - Double型m x n二维数组,存放相减的左边矩阵
'          mtxB  - Double型m x n二维数组,存放相减的右边矩阵
'          mtxC  - Double型m x n二维数组,返回差矩阵
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MSub(m As Integer, n As Integer, mtxA() As Double, mtxB() As Double, mtxC() As Double)
    Dim i As Integer, j As Integer
    For i = 1 To m
        For j = 1 To n
            mtxC(i, j) = mtxA(i, j) + mtxB(i, j)
        Next j
    Next i
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MNmul
'  功能:  计算矩阵的数乘
'  参数:  m   - Integer型变量,矩阵的行数
'          n   - Integer型变量,矩阵的列数
'          dblNum  - Double型变量,乘数
'          mtxA  - Double型m x n二维数组,存放乘数矩阵
'          mtxB  - Double型m x n二维数组,存放数乘的结果矩阵
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MNmul(m As Integer, n As Integer, dblNum As Double, mtxA() As Double, mtxB() As Double)
    Dim i As Integer, j As Integer
    For i = 1 To m
        For j = 1 To n
            mtxB(i, j) = dblNum * mtxA(i, j)
        Next j
    Next i
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MTrans
'  功能:  计算矩阵的转置
'  参数:  m   - Integer型变量,矩阵的行数
'          n   - Integer型变量,矩阵的列数
'          mtxA  - Double型m x n二维数组,存放原矩阵
'          mtxAT  - Double型n x m二维数组,返回转置矩阵
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MTrans(m As Integer, n As Integer, mtxA() As Double, mtxAT() As Double)
    Dim i As Integer, j As Integer
    For i = 1 To m
        For j = 1 To n
            mtxAT(i, j) = mtxAT(j, i)
        Next j
    Next i
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-30 16:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MMul
'  功能:  计算矩阵的乘法
'  参数:  m   - Integer型变量,相乘的左边矩阵的行数
'          n   - Integer型变量,相乘的左边矩阵的列数和右边矩阵的行数
'          l   -  Integer型变量,相乘的右边矩阵的列数
'          mtxA  - Double型m x n二维数组,存放相乘的左边矩阵
'          mtxB  - Double型n x l二维数组,存放相乘的右边矩阵
'          mtxC  - Double型m x l二维数组,返回矩阵乘积矩阵
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MMul(m As Integer, n As Integer, l As Integer, mtxA() As Double, mtxB() As Double, mtxC() As Double)
    Dim i As Integer, j As Integer, k As Integer

    For i = 1 To m
        For j = 1 To l
            mtxC(i, j) = 0#
            For k = 1 To n
                mtxC(i, j) = mtxC(i, j) + mtxA(i, k) * mtxB(k, j)
            Next k
        Next j
    Next i

End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-30 16:53 | 显示全部楼层
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MCmul
'  功能:  计算复矩阵乘法
'  参数:  m   - Integer型变量,相乘的左边矩阵的行数
'          n   - Integer型变量,相乘的左边矩阵的列数和右边矩阵的行数
'          l   -  Integer型变量,相乘的右边矩阵的列数
'          mtxAR  - Double型m x n二维数组,存放相乘的左边矩阵的实部
'          mtxAI  - Double型m x n二维数组,存放相乘的左边矩阵的虚部
'          mtxBR  - Double型n x l二维数组,存放相乘的右边矩阵的实部
'          mtxBI  - Double型n x l二维数组,存放相乘的右边矩阵的虚部
'          mtxCR  - Double型m x l二维数组,返回矩阵乘积矩阵的实部
'          mtxCI  - Double型m x l二维数组,返回矩阵乘积矩阵的虚部
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MCmul(m As Integer, n As Integer, l As Integer, mtxAR() As Double, mtxAI() As Double, _
mtxBR() As Double, mtxBI() As Double, mtxCR() As Double, mtxCI() As Double)
    Dim i As Integer, j As Integer, k As Integer
    Dim p As Double, q As Double, s As Double

    For i = 1 To m
        For j = 1 To l
            mtxCR(i, j) = 0#
            mtxCI(i, j) = 0#
            For k = 1 To n
                p = mtxAR(i, k) * mtxBR(k, j)
                q = mtxAI(i, k) * mtxBI(k, j)
                s = (mtxAR(i, k) + mtxAI(i, k)) * (mtxBR(k, j) + mtxBI(k, j))
                mtxCR(i, j) = mtxCR(i, j) + p - q
                mtxCI(i, j) = mtxCI(i, j) + s - p - q
            Next k
        Next j
    Next i

End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-30 16:54 | 显示全部楼层
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MRinv
'  功能:  矩阵求逆
'  参数:  n      - Integer型变量,矩阵的阶数
'          mtxA   - Double型二维数组,体积为n x n。存放原矩阵A;返回时存放其逆矩阵A-1。
'  返回值:Boolean型,失败为False,成功为True
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MRinv(n As Integer, mtxA() As Double) As Boolean
    ' 局部变量
    ReDim nIs(n) As Integer, nJs(n) As Integer
    Dim i As Integer, j As Integer, k As Integer
    Dim d As Double, p As Double

    ' 全选主元,消元
    For k = 1 To n
        d = 0#
        For i = k To n
            For j = k To n
                p = Abs(mtxA(i, j))
                If (p > d) Then
                    d = p
                    nIs(k) = i
                    nJs(k) = j
                End If
            Next j
        Next i
        
        ' 求解失败
        If (d + 1# = 1#) Then
            MRinv = False
            Exit Function
        End If

        If (nIs(k) <> k) Then
            For j = 1 To n
                p = mtxA(k, j)
                mtxA(k, j) = mtxA(nIs(k), j)
                mtxA(nIs(k), j) = p
            Next j
        End If

        If (nJs(k) <> k) Then
            For i = 1 To n
                p = mtxA(i, k)
                mtxA(i, k) = mtxA(i, nJs(k))
                mtxA(i, nJs(k)) = p
            Next i
        End If

        mtxA(k, k) = 1# / mtxA(k, k)
        For j = 1 To n
            If (j <> k) Then mtxA(k, j) = mtxA(k, j) * mtxA(k, k)
        Next j
        For i = 1 To n
            If (i <> k) Then
                For j = 1 To n
                    If (j <> k) Then mtxA(i, j) = mtxA(i, j) - mtxA(i, k) * mtxA(k, j)
                Next j
            End If
        Next i
        For i = 1 To n
            If (i <> k) Then mtxA(i, k) = -mtxA(i, k) * mtxA(k, k)
        Next i
    Next k

    ' 调整恢复行列次序
    For k = n To 1 Step -1
        If (nJs(k) <> k) Then
          For j = 1 To n
              p = mtxA(k, j)
              mtxA(k, j) = mtxA(nJs(k), j)
              mtxA(nJs(k), j) = p
          Next j
        End If
        If (nIs(k) <> k) Then
          For i = 1 To n
              p = mtxA(i, k)
              mtxA(i, k) = mtxA(i, nIs(k))
              mtxA(i, nIs(k)) = p
          Next i
        End If
    Next k
   
    ' 求解成功
    MRinv = True

End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-30 16:55 | 显示全部楼层
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MCinv
'  功能:  复矩阵求逆
'  参数:  n      - Integer型变量,矩阵的阶数
'          mtxAR   - Double型二维数组,体积为n x n。存放原矩阵A的实部;返回时存放其逆矩阵A-的实部。
'          mtxAI   - Double型二维数组,体积为n x n。存放原矩阵A的虚部;返回时存放其逆矩阵A-的虚部。
'  返回值:Boolean型,失败为False,成功为True
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MCinv(n As Integer, mtxAR() As Double, mtxAI() As Double) As Boolean
    ' 局部变量
    ReDim nIs(n) As Integer, nJs(n) As Integer
    Dim i As Integer, j As Integer, k As Integer
    Dim d As Double, p As Double, s As Double, t As Double, q As Double, b As Double

    ' 全选主元,消元
    For k = 1 To n
        d = 0#
        For i = k To n
            For j = k To n
                p = mtxAR(i, j) * mtxAR(i, j) + mtxAI(i, j) * mtxAI(i, j)
                If (p > d) Then
                    d = p
                    nIs(k) = i
                    nJs(k) = j
                End If
            Next j
        Next i

        ' 求解失败
        If (d + 1# = 1#) Then
            MCinv = False
            Exit Function
        End If

        If (nIs(k) <> k) Then
          For j = 1 To n
              t = mtxAR(k, j)
              mtxAR(k, j) = mtxAR(nIs(k), j)
              mtxAR(nIs(k), j) = t

              t = mtxAI(k, j)
              mtxAI(k, j) = mtxAI(nIs(k), j)
              mtxAI(nIs(k), j) = t
            Next j
        End If
        If (nJs(k) <> k) Then
            For i = 1 To n
                t = mtxAR(i, k)
                mtxAR(i, k) = mtxAR(i, nJs(k))
                mtxAR(i, nJs(k)) = t
                t = mtxAI(i, k)
                mtxAI(i, k) = mtxAI(i, nJs(k))
                mtxAI(i, nJs(k)) = t
            Next i
        End If

        mtxAR(k, k) = mtxAR(k, k) / d
        mtxAI(k, k) = -mtxAI(k, k) / d
        For j = 1 To n
            If (j <> k) Then
                p = mtxAR(k, j) * mtxAR(k, k)
                q = mtxAI(k, j) * mtxAI(k, k)
                s = (mtxAR(k, j) + mtxAI(k, j)) * (mtxAR(k, k) + mtxAI(k, k))
                mtxAR(k, j) = p - q
                mtxAI(k, j) = s - p - q
            End If
        Next j
        For i = 1 To n
            If (i <> k) Then
              For j = 1 To n
                    If (j <> k) Then
                        p = mtxAR(k, j) * mtxAR(i, k)
                        q = mtxAI(k, j) * mtxAI(i, k)
                        s = (mtxAR(k, j) + mtxAI(k, j)) * (mtxAR(i, k) + mtxAI(i, k))
                        t = p - q
                        b = s - p - q
                        mtxAR(i, j) = mtxAR(i, j) - t
                        mtxAI(i, j) = mtxAI(i, j) - b
                    End If
                Next j
            End If
        Next i

        For i = 1 To n
            If (i <> k) Then
                p = mtxAR(i, k) * mtxAR(k, k)
                q = mtxAI(i, k) * mtxAI(k, k)
                s = (mtxAR(i, k) + mtxAI(i, k)) * (mtxAR(k, k) + mtxAI(k, k))
                mtxAR(i, k) = q - p
                mtxAI(i, k) = p + q - s
            End If
        Next i
    Next k

    ' 调整恢复行列次序
    For k = n To 1 Step -1
        If (nJs(k) <> k) Then
          For j = 1 To n
              t = mtxAR(k, j)
              mtxAR(k, j) = mtxAR(nJs(k), j)
              mtxAR(nJs(k), j) = t
              t = mtxAI(k, j)
              mtxAI(k, j) = mtxAI(nJs(k), j)
              mtxAI(nJs(k), j) = t
            Next j
        End If
        If (nIs(k) <> k) Then
            For i = 1 To n
                t = mtxAR(i, k)
                mtxAR(i, k) = mtxAR(i, nIs(k))
                mtxAR(i, nIs(k)) = t
                t = mtxAI(i, k)
                mtxAI(i, k) = mtxAI(i, nIs(k))
                mtxAI(i, nIs(k)) = t
            Next i
        End If
    Next k
   
    ' 求解成功
    MCinv = True

End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-30 16:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MSsgj
'  功能:  计算对称正定矩阵的逆
'  参数:  n     - Integer型变量,矩阵阶数。
'          mtxA  - Double型二维数组,体积为n x n。存放实对称正定矩阵A;返回时存放逆矩阵A-。
'  返回值:Boolean型,成功为True,失败为False。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MSsgj(n As Integer, mtxA() As Double) As Boolean
    ' 局部变量
    Dim i As Integer, j, k, m
    Dim w As Double, g As Double
    ReDim b(n) As Double

    ' 循环重新编号求解
    For k = 1 To n
        w = a(1, 1)
         ' 求解失败
        If (Abs(w) + 1# = 1#) Then
            MSsgj = False
            Exit Function
        End If

        m = n - k - 1
        For i = 2 To n
            g = a(i, 1)
            b(i) = g / w
            If (i <= m) Then b(i) = -b(i)
            For j = 2 To i
              a(i - 1, j - 1) = a(i, j) + g * b(j)
            Next j
        Next i
        a(n, n) = 1# / w
        For i = 2 To n
          a(n, i - 1) = b(i)
        Next i
    Next k

    For i = 1 To n - 1
        For j = i + 1 To n
            a(i, j) = a(j, i)
        Next j
    Next i

' 求解成功
MSsgj = True

End Function

TA的精华主题

TA的得分主题

发表于 2020-5-30 17:00 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-30 17:01 | 显示全部楼层
未完待续,有时间接着传 有需要的拿走不谢

TA的精华主题

TA的得分主题

发表于 2020-5-30 18:01 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-1 10:42 | 显示全部楼层

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MTinv
'  功能:  用特兰持(Trench)方法求托伯利兹(Toeplitz)矩阵的逆矩阵
'  参数:  n      - Integer型变量,T型矩阵阶数。
'          dblT   - Double型一维数组,长度为n。存放n阶T型矩阵中的上三角元素t0,t1,…tn-1。
'          dblTT  - Double型一维数组,长度为n。其中后n-1个元素tt(1),…,tt(n-1)依次存放n阶T型矩阵中的元素。
'          dblB    - Double型二维数组,体积为n x n。返回n阶T型矩阵的逆矩阵。
'  返回值:Boolean型,成功为True,失败为False。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MTinv(n As Integer, dblT() As Double, dblTT() As Double, dblB() As Double) As Boolean
    ' 局部变量
    Dim i As Integer, j As Integer, k As Integer
    Dim a As Double, s As Double
    ReDim c(n) As Double, r(n) As Double, p(n) As Double

    ' 矩阵非T型矩阵
    If (Abs(dblT(1)) + 1# = 1#) Then
        MTinv = False
        Exit Function
    End If

    ' 取初值
    a = dblT(1)
    c(1) = dblTT(2) / dblT(1)
    r(1) = dblT(2) / dblT(1)

    ' 循环计算
    For k = 1 To n - 2
        s = 0#
        For j = 2 To k + 1
          s = s + c(k + 1 - j + 1) * dblTT(j)
        Next j

        s = (s - dblTT(k + 2)) / a

        For i = 1 To k
          p(i) = c(i) + s * r(k - i + 1)
        Next i

        c(k + 1) = -s
        s = 0#
        For j = 2 To k + 1
          s = s + r(k + 1 - j + 1) * dblT(j)
        Next j

        s = (s - dblT(k + 2)) / a
        For i = 1 To k
            r(i) = r(i) + s * c(k - i + 1)
            c(k - i + 1) = p(k - i + 1)
        Next i
        
        r(k + 1) = -s
        a = 0#
        For j = 2 To k + 2
          a = a + dblT(j) * c(j - 1)
        Next j

        a = dblT(1) - a
        If (Abs(a) + 1# = 1#) Then
            MTinv = False
            Exit Function
        End If
    Next k

    dblB(1, 1) = 1# / a
    For i = 1 To n - 1
        dblB(1, i + 1) = -r(i) / a
        dblB(i + 1, 1) = -c(i) / a
    Next i

    ' 计算逆矩阵中的各元素
    For i = 1 To n - 1
        For j = 1 To n - 1
            dblB(i + 1, j + 1) = dblB(i, j) - c(i) * dblB(1, j + 1)
            dblB(i + 1, j + 1) = dblB(i + 1, j + 1) + c(n - j) * dblB(1, n - i + 1)
        Next j
    Next i

    ' 求解成功
    MTinv = True
   
End Function
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-22 20:25 , Processed in 0.042208 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表