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

📄 form03.frm

📁 本文档包括了对软件中用到的多元统计分析中判别分析与聚类分析的主要方法(包括距离判别分析,费希尔判别分析,贝叶斯判别分析,逐步判别分析及聚类分析)原理及在本软件中使用的基本方法与设计流程图进行了详尽的阐
💻 FRM
📖 第 1 页 / 共 2 页
字号:
VERSION 5.00
Object = "{8AE029D0-08E3-11D1-BAA2-444553540000}#3.0#0"; "VSFLEX3.OCX"
Begin VB.Form Form03 
   AutoRedraw      =   -1  'True
   BackColor       =   &H80000013&
   Caption         =   "费希尔判别分析"
   ClientHeight    =   6255
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   10485
   FillColor       =   &H8000000F&
   ForeColor       =   &H8000000F&
   Icon            =   "Form03.frx":0000
   LinkTopic       =   "Form1"
   ScaleHeight     =   6255
   ScaleMode       =   0  'User
   ScaleWidth      =   5664.506
   StartUpPosition =   3  '窗口缺省
   Begin VB.TextBox Text3 
      Height          =   1815
      Left            =   3480
      MultiLine       =   -1  'True
      ScrollBars      =   3  'Both
      TabIndex        =   14
      Top             =   1920
      Width           =   6555
   End
   Begin VB.TextBox Text4 
      Height          =   375
      Left            =   1920
      TabIndex        =   2
      Top             =   1320
      Width           =   855
   End
   Begin VB.CommandButton Command2 
      Caption         =   "分  析"
      Height          =   495
      Left            =   1680
      TabIndex        =   8
      Top             =   3120
      Width           =   1215
   End
   Begin VB.CommandButton Command1 
      Caption         =   "重  置"
      Height          =   495
      Left            =   480
      TabIndex        =   7
      Top             =   3120
      Width           =   1095
   End
   Begin VB.Frame Frame2 
      BackColor       =   &H80000013&
      Caption         =   "结果显示"
      Height          =   2295
      Left            =   600
      TabIndex        =   6
      Top             =   3840
      Width           =   9495
      Begin VB.TextBox Text5 
         BackColor       =   &H80000013&
         Height          =   1935
         Left            =   120
         MultiLine       =   -1  'True
         ScrollBars      =   3  'Both
         TabIndex        =   9
         Top             =   240
         Width           =   9255
      End
   End
   Begin VB.Frame Frame1 
      BackColor       =   &H80000013&
      Caption         =   "数据输入方式"
      Height          =   1215
      Left            =   480
      TabIndex        =   3
      Top             =   1800
      Width           =   2415
      Begin VB.OptionButton Option2 
         BackColor       =   &H80000013&
         Caption         =   "使用文本框"
         Height          =   255
         Left            =   480
         TabIndex        =   5
         Top             =   840
         Width           =   1455
      End
      Begin VB.OptionButton Option1 
         BackColor       =   &H80000013&
         Caption         =   "使用表格"
         Height          =   255
         Left            =   480
         TabIndex        =   4
         Top             =   360
         Value           =   -1  'True
         Width           =   1335
      End
   End
   Begin VB.TextBox Text2 
      Height          =   375
      Left            =   1920
      TabIndex        =   1
      Top             =   720
      Width           =   855
   End
   Begin VB.TextBox Text1 
      Height          =   375
      Left            =   1920
      TabIndex        =   0
      Top             =   120
      Width           =   855
   End
   Begin vsFlexLib.vsFlexArray vsFlexArray1 
      Height          =   1455
      Left            =   3480
      TabIndex        =   13
      Top             =   240
      Width           =   6495
      _Version        =   196608
      _ExtentX        =   11456
      _ExtentY        =   2566
      _StockProps     =   228
      Appearance      =   1
      ConvInfo        =   1413783674
   End
   Begin VB.Label Label1 
      BackColor       =   &H80000013&
      Caption         =   "样品总数"
      Height          =   255
      Left            =   600
      TabIndex        =   12
      Top             =   240
      Width           =   735
   End
   Begin VB.Label Label2 
      BackColor       =   &H80000013&
      Caption         =   "指标总数"
      Height          =   255
      Left            =   600
      TabIndex        =   11
      Top             =   840
      Width           =   735
   End
   Begin VB.Label Label3 
      BackColor       =   &H80000013&
      Caption         =   "类别总数"
      Height          =   255
      Left            =   600
      TabIndex        =   10
      Top             =   1320
      Width           =   735
   End
End
Attribute VB_Name = "Form03"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Base 1
Dim Y() As String, x() As Double, m%, n%, k%, k1() As Integer, k2() As Integer

Sub putout(A() As Double, m1%, n1%)
'****************************************************************************************
'  功能  :  输出矩阵
'  参数  :  A为待输出的矩阵;m1为a矩阵的行;n1为a矩阵的列
'  返回值:  无返回值
'****************************************************************************************
For i = 1 To m1
        For j = 1 To n1
            Print Tab(j * 22); A(i, j);
        Next j
    Next i
    Print
End Sub

Sub chengfa(a1() As Double, a2() As Double, F() As Double)
'****************************************************************************************
'  功能  :  求两矩阵的乘积
'  参数  :  a1,a2为待求乘积的两矩阵(a1的列数必须与a2的行数相同,否则结果无效)
'  返回值:  F返回乘积结果的矩阵,行数与a1的相同,列数与a2的相同
'**************************************************************************************
If UBound(a1, 2) <> UBound(a2, 1) Then
    MsgBox ("要相乘的第一矩阵的列数和第二矩阵的行数必须相同")
    Exit Sub
Else
    For i = 1 To UBound(a1, 1)
        For j = 1 To UBound(a2, 2)
            F(i, j) = 0                      '原来f矩阵可能被存入非零数据,所以要逐个赋0
            For kk = 1 To UBound(a1, 2)
                F(i, j) = F(i, j) + a1(i, kk) * a2(kk, j)
    Next kk, j, i
End If
End Sub

Sub pingjun(A() As Double, m1%, qd%, zd%, pj() As Double)
'****************************************************************************************
'  功能  :  求m行矩阵从第qd列到第zd列的平均
'  参数  :  A为待求矩阵;m为矩阵的行数;qd为起始列下标;zd终止列下标
'  返回值:  pj返回最终结果,是一m为列向量
'****************************************************************************************
    ReDim pj(m1, 1) As Double  '原来的pj列向量可能已存入非零数据,故重新声明使其数据均为零
    For i = 1 To m1
        For j = qd To zd
            pj(i, 1) = pj(i, 1) + A(i, j)
        Next j
       pj(i, 1) = pj(i, 1) / (zd - qd + 1)
    Next i
End Sub

Sub licha(A() As Double, m1%, qd%, zd%, lc() As Double)
'****************************************************************************************
'  功能  :  求m行矩阵从第qd列到第zd列的离差
'  参数  :  A为待求矩阵;m为矩阵的行数;qd为起始列下标;zd终止列下标
'  返回值:  lc返回最终结果,是一m1为列向量
'****************************************************************************************
ReDim lc(m1, m1) As Double    '原来的lc矩阵可能已存入非零数据,所以要重新声明使其数据均为零
Dim pj1() As Double: ReDim pj(m, 1)
    Call pingjun(A(), m1, qd, zd, pj1())
For r = 1 To m1
    For t = 1 To m1
        For j = qd To zd
            sum = sum + (A(r, j) - pj1(r, 1)) * (A(t, j) - pj1(t, 1))
        Next j
        lc(r, t) = sum: sum = 0
Next t, r
End Sub

Sub zhuanzhi(A() As Double, B() As Double)
'****************************************************************************************
'  功能  :  求矩阵的转置
'  参数  :  A为待求矩阵
'  返回值:  B返回最终结果即A的转置
'****************************************************************************************
Dim m1%, n1%
m1 = UBound(A, 1): n1 = UBound(A, 2)
ReDim B(n1, m1)
For i = 1 To n1
    For j = 1 To m1
        B(i, j) = A(j, i)
Next j, i
End Sub

Sub MRinv(n1 As Integer, A() As Double, mtxA() As Double, flag As Boolean)
'****************************************************************************************
'  功能  :  用全选主元高斯-约当法实现矩阵求逆
'  参数  :  A为待求矩阵;n1为其阶数
'  返回值: flag返回False表示求逆失败(无逆),返回True表示求逆成功结果存入mtxA矩阵
'****************************************************************************************
ReDim nIs(n1) As Integer, nJs(n1) As Integer
Dim i As Integer, j As Integer, kk As Integer
Dim d As Double, p As Double
For i = 1 To n1
    For j = 1 To n1
    mtxA(i, j) = A(i, j)
Next j, i
' 全选主元,消元
For kk = 1 To n1
    d = 0#
    For i = kk To n1
        For j = kk To n1
            p = Abs(mtxA(i, j))
            If (p > d) Then
                d = p
                nIs(kk) = i
                nJs(kk) = j
            End If
        Next j
    Next i
                                         ' 求逆失败
    If (d + 1# = 1#) Then
        flag = False
        Exit Sub
    End If

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

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

    mtxA(kk, kk) = 1# / mtxA(kk, kk)
    For j = 1 To n1
        If (j <> kk) Then mtxA(kk, j) = mtxA(kk, j) * mtxA(kk, kk)
    Next j
    For i = 1 To n1
        If (i <> kk) Then
            For j = 1 To n1
                If (j <> kk) Then mtxA(i, j) = mtxA(i, j) - mtxA(i, kk) * mtxA(kk, j)
            Next j
        End If
    Next i
    For i = 1 To n1
        If (i <> kk) Then mtxA(i, kk) = -mtxA(i, kk) * mtxA(kk, kk)
    Next i
Next kk
For kk = n1 To 1 Step -1                  ' 调整恢复行列次序
    If (nJs(kk) <> kk) Then
      For j = 1 To n1
          p = mtxA(kk, j)
          mtxA(kk, j) = mtxA(nJs(kk), j)
          mtxA(nJs(kk), j) = p
      Next j
    End If
    If (nIs(kk) <> kk) Then
      For i = 1 To n1
          p = mtxA(i, kk)
          mtxA(i, kk) = mtxA(i, nIs(kk))
          mtxA(i, nIs(kk)) = p
      Next i
    End If
Next kk
flag = True                             ' 求逆成功
End Sub

Function VS(A() As Double, xz As Double) As Double
'*******************************************************************************************
'  功能  :  求矩阵A 的最大或最小值
'  参数  :  A为待求矩阵; xz为选择结果,xz>=0表示求A的最大值,否则求其最小值
'  返回值:  函数名VS返回结果
'*******************************************************************************************
    Dim f1#, f2#
    For i = 1 To UBound(A, 1)
        For j = 1 To UBound(A, 2)
            f1 = IIf(f1 <= A(i, j), A(i, j), f1)
            f2 = IIf(f2 > A(i, j), A(i, j), f2)
        Next j, i
    Select Case xz
        Case Is >= 0: VS = f1
        Case Else: VS = f2
    End Select
End Function

Function absF(A() As Double, B() As Double)
'********************************************************************************************
'  功能  :  求矩阵A 的绝对值矩阵
'  参数  :  A为待求矩阵
'  返回值:  B返回结果
'********************************************************************************************
For i = 1 To UBound(A, 1)
    For j = 1 To UBound(A, 2)
    B(i, j) = Abs(A(i, j))
Next j, i
End Function

Sub tezheng(A() As Double, mv As Double, u() As Double)
'*******************************************************************************************
'  功能  :  求矩阵按模最大特征值及其对应的特征向量
'  参数  :  a为待求矩阵
'  返回值:  mv返回按模最大的特征值;u返回其所对应的特征向量
'*******************************************************************************************
    Dim u0() As Double, u1() As Double, u2() As Double, m1 As Integer
    m1 = UBound(A, 1)                    'm待求矩阵的阶数
    ReDim u0(m, 1), u1(m1, 1), u2(m1, 1), u(m1, 1)
    u0(m1, 1) = 1                        'u0为初始向量,仅为其最后一个分量赋值为1,其余为0
    Err = 10                            'Err将用来表达迭代的收敛情况,当其趋于零时,停止迭代
    kk = 1                               'k将用来限定迭代次数
    Dim ff As Boolean
    Call chengfa(A(), u0(), u1())
    Call absF(u1(), u2())
    mv = VS(u2(), 1)
    For i = 1 To m
        u(i, 1) = u1(i, 1) / mv         '进行标准化
    Next i
    Do While (Err > 0.00000001 And kk < 15)
        Call chengfa(A(), u(), u1())
        Call absF(u1(), u2())
        mv = VS(u2(), 1)
        For i = 1 To m1
            u0(i, 1) = u1(i, 1) / mv    '进行标准化
        Next i
        Err = 0#
        For i = 1 To m1
             e = Abs(u0(i, 1) - u(i, 1))
             If (Err < e) Then Err = e
        Next i
        For i = 1 To m1
            u(i, 1) = u0(i, 1)
        Next i
        kk = kk + 1
  Loop
End Sub

Sub xiangjia(a1() As Double, a2() As Double, he() As Double)
'******************************************************************************************
'  功能  :  两矩阵相加
'  参数  :  a1,a2为待相加的两矩阵(a1、a2的列数和行数必须相同,否则结果无效)
'  返回值:  he返回相加后的结果矩阵;与a1、a2的行数和列数相同
'******************************************************************************************
If (UBound(a1, 1) <> UBound(a2, 1) Or UBound(a1, 2) <> UBound(a2, 2)) Then
    MsgBox ("要相加的矩阵的行数和列数必须相同")
    Exit Sub
Else
    For i = 1 To UBound(a1, 1)
        For j = 1 To UBound(a1, 2)
            he(i, j) = a1(i, j) + a2(i, j)

⌨️ 快捷键说明

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