⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.frm

📁 线性回归
💻 FRM
字号:
VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   3870
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   5640
   LinkTopic       =   "Form1"
   ScaleHeight     =   3870
   ScaleWidth      =   5640
   StartUpPosition =   3  '窗口缺省
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Public Sub arrMatT(mat() As Double, matT() As Double) '----矩阵翻转-----
Dim x, y, i, j As Integer
x = UBound(mat, 1)
y = UBound(mat, 2)
ReDim matT(y, x)
For i = 1 To x
For j = 1 To y
matT(j, i) = mat(i, j)
Next
Next
End Sub
Public Sub arrMatM(mat1() As Double, mat2() As Double, matM() As Double) '----2维矩阵相乘----
Dim x1, x2, y1, y2 As Integer
Dim i, j, k As Integer
x1 = UBound(mat1, 1)
y1 = UBound(mat1, 2)
x2 = UBound(mat2, 1)
y2 = UBound(mat2, 2)
If y1 <> x2 Then
MsgBox "不能相乘"
Exit Sub
End If
ReDim matM(x1, y2)
For i = 1 To x1
For j = 1 To y2
For k = 1 To y1
matM(i, j) = matM(i, j) + mat1(i, k) * mat2(k, j)
Next
Next
Next
End Sub
Public Sub jzqn(qa() As Double, na() As Double) '--------矩阵求逆---------
Dim a()
n = UBound(qa, 1)
ReDim na(n, n)
ReDim a(n, 2 * n)
  For i = 1 To n
    For j = 1 To n
      a(i, j) = qa(i, j)
    Next j
  Next i
For i = 1 To n
 For j = n + 1 To 2 * n
  If j - i = n Then
  a(i, j) = 1
  Else
  a(i, j) = 0
  End If
  Next j
  Next i
 For i = 1 To n
  If a(i, i) = 0 Then
    For q = i To n
    If a(q, i) <> 0 Then
       For w = i To 2 * n
         zj = a(i, w)
         a(i, w) = a(q, w)
         a(q, w) = zj
       Next w
       Exit For
    End If
    Next q
    If q > n Then MsgBox "此矩阵不可逆": Exit Sub
  End If
  For k = 2 * n To i Step -1
  a(i, k) = a(i, k) / a(i, i)
  Next k
  For j = i + 1 To n
  If a(j, i) <> 0 Then
     For k = 2 * n To i Step -1
    a(j, k) = a(j, k) / a(j, i) - a(i, k)
    Next k
    End If
 Next j
Next i
For i = n To 1 Step -1
  If a(i, i) = 0 Then
    For q = i - 1 To 1 Step -1
    If a(q, i) <> 0 Then
       For w = i To 2 * n
         zj = a(i, w)
         a(i, w) = a(q, w)
         a(q, w) = zj
       Next w
       Exit For
    End If
    Next q
  End If
  For k = 2 * n To i Step -1
  a(i, k) = a(i, k) / a(i, i)
  Next k
  For j = i - 1 To 1 Step -1
  If a(j, i) <> 0 Then
  xxx = a(j, i)
  For k = 2 * n To 1 Step -1
    a(j, k) = a(j, k) / xxx - a(i, k)
    Next k
    End If
 Next j
Next i
For i = 1 To n
 For j = 1 To n
   na(i, j) = a(i, j + n)
Next j
Next i
End Sub
'----------------------过程结束---------
Public Sub arrMatB(matY() As Double, matX() As Double, matb() As Double) '-----求系数B-------
Dim x1, y1, y, b As Integer
Dim matT() As Double '翻转矩阵
Dim matM() As Double '翻转矩阵与原来矩阵相乘
Dim matInv() As Double 'matM矩阵求逆
Dim temp() As Double 'matInv*matT
x1 = UBound(matX, 1)
y1 = UBound(matX, 2)
y = UBound(matY, 1)
b = x1
ReDim matb(b, 1)
Call arrMatT(matX, matT)
Call arrMatM(matT, matX, matM)
Call jzqn(matM, matInv)
Call arrMatM(matInv, matT, temp)
Call arrMatM(temp, matY, matb)



End Sub



Private Sub Form_Load() '------例子-----
Show
Dim a(2, 2) As Double
Dim matb() As Double
Dim matY(2, 1) As Double

a(1, 1) = 2
a(2, 2) = 2
a(1, 2) = 1
 a(2, 1) = 3
 matY(1, 1) = 3
 matY(2, 1) = 5

Call arrMatB(matY, a, matb)

For i = 1 To 2
Print matb(i, 1)
Next

End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -