📄 form03.frm
字号:
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 + -