'Dim I As Byte, I0 As Byte, J As Byte, Ij As Byte, N As Byte
' N是矩陣的大小。對于3x3矩陣,N為3;對于NxN矩陣,N為相應(yīng)的值
'N = 3
'For I = 1 TO N '1, 2, 3
'I0 = I - 1 '0, 1, 2
'I0 = I0 * N '0, 3, 6(計算當(dāng)前行之前所有行的元素總數(shù))
'For J = 1 TO N '例如,當(dāng)I=2時,I0=3,則J=1,2,3
'Ij = I0 + J '計算一維數(shù)組中的索引位置,即4, 5, 6
'Next J
'Next I
Declare Sub Matadd()
Declare Sub Matsub()
Declare Sub Matmul()
Declare Sub Matinv()
Declare Sub Matprint(byval Ksi As Single)
Dim Iby As Byte , I0by As Byte , Ijby As Byte , Ikby As Byte , Irby As Byte
Dim Jby As Byte , J0by As Byte
Dim Kby As Byte , K0by As Byte , Kjby As Byte
Dim Rby As Byte , R0by As Byte , Riby As Byte , Rjby As Byte , Rrby As Byte , Rsby As Byte
Dim Sby As Byte , S0by As Byte , Siby As Byte , Srby As Byte , Ssby As Byte
Dim Iin As Integer
Dim Isi As Single , Jsi As Single , Ksi As Single , Msi As Single
Dim A(mbyc) As Single , B(mbyc) As Single , C(mbyc) As Single
'Temporary:
Dim M1(mbyc) As Single , M2(mbyc) As Single , M3(mbyc) As Single , M4(mbyc) As Single , M5(mbyc ) As Single
'用(偽)隨機數(shù)填充矩陣A
'
For Iby = 1 To Mbyc
Iin = Rnd(1000)
Isi = Iin
A(iby) = Isi / 100
Next Iby
'*******************************************************************************
'******************************* 矩陣加法 *******************************
'*******************************************************************************
Sub Matadd 'C = A + B
For Iby = 1 To Mbyc
C(iby) = A(iby) + B(iby)
Next Iby
End Sub
'*******************************************************************************
'******************************* 矩陣減法 ****************************
'*******************************************************************************
Sub Matsub 'C = A - B
For Iby = 1 To Mbyc
C(iby) = A(iby) - B(iby)
Next Iby
End Sub
'*******************************************************************************
'*************************** 矩陣乘法*****************************
'*******************************************************************************
Sub Matmul 'C = A * B
For Iby = 1 To Nbyc
I0by = Iby - 1
I0by = I0by * Nbyc
For Jby = 1 To Nbyc
Ijby = I0by + Jby
C(ijby) = 0
For Kby = 1 To Nbyc
K0by = Kby - 1
K0by = K0by * Nbyc
Kjby = K0by + Jby
Ikby = I0by + Kby
Jsi = A(ikby) * B(kjby)
C(ijby) = C(ijby) + Jsi
Next Kby
Next Jby
Next Iby
End Sub
'*******************************************************************************
'******************************* 矩陣求逆 ******************************
'*******************************************************************************
Sub Matinv 'B = 1/A
'
'將原始矩陣A復(fù)制到M1中
'
For Iby = 1 To Mbyc
M1(iby) = A(iby)
Next Iby
'
'填充兩個單位矩陣:對于i等于j的情況,M2(i,j) = 1,M4(i,j) = 1;
'對于i不等于j的情況,M2(i,j) = 0,M4(i,j) = 0。
For Iby = 1 To Nbyc
I0by = Iby - 1
I0by = I0by * Nbyc
For Jby = 1 To Nbyc
Ijby = I0by + Jby
If Iby = Jby Then
M2(ijby) = 1
M4(ijby) = 1
Else
M2(ijby) = 0
M4(ijby) = 0
End If
Next Jby
Next Iby
For Rby = 1 To Nbyc 'Row byte RBy
R0by = Rby - 1 '0, 1, 2, 3..
R0by = R0by * Nbyc '0,Nbyc,2Nbyc,3Nbyc
Isi = 0
'------------------------------------'Pivotation中心點或軸
For Iby = Rby To Nbyc '矩陣或表格的對角線開始提取或構(gòu)建行
I0by = Iby - 1
I0by = I0by * Nbyc
Irby = I0by + Rby 'index of element in 1D: Ir一維中元素的索引
Jsi = M1(irby)
Jsi = Abs(jsi)
If Jsi >= Isi Then '找到最大的元素
Isi = Jsi '
Sby = Iby '記住用于交換行的(操作或步驟)
End If
Next Iby
S0by = Sby - 1
S0by = S0by * Nbyc
For Iby = 1 To Nbyc
Riby = R0by + Iby 'Row R , column I “R”代表行號,而“I”代表列號。
Siby = S0by + Iby 'Row to swap, “要交換的行”
Swap M1(riby) , M1(siby)
Next Iby
Rrby = R0by + Rby
Jsi = M1(rrby)
Jsi = Abs(jsi)
If Jsi < 10e-30 Then
Print "奇異矩陣:無法進行求逆"
End If
'End Sub
Ssby = S0by + Sby
Rsby = R0by + Sby
Srby = S0by + Rby
M4(rrby) = 0
M4(ssby) = 0
M4(rsby) = 1
M4(srby) = 1
'-----------------------------------' 高斯-約旦消元法(Gauss-Jordan Elimination)
For Iby = 1 To Nbyc
I0by = Iby - 1
I0by = I0by * Nbyc
Irby = I0by + Rby
For Jby = 1 To Nbyc
J0by = Iby - 1
J0by = J0by * Nbyc
Ijby = I0by + Jby
Rjby = R0by + Jby
If Iby = Rby Then
If Iby = Jby Then
M3(rrby) = 1 / M1(rrby)
Else
M3(ijby) = M1(ijby) / M1(rrby)
M3(ijby) = 0 - M3(ijby)
End If
Elseif Jby = Rby Then
M3(irby) = M1(irby) / M1(rrby)
Else
Jsi = M1(rjby) * M1(irby)
Jsi = Jsi / M1(rrby)
M3(ijby) = M1(ijby) - Jsi
End If
Next Jby
Next Iby
'-----------------------------' 矩陣乘法 M5 = M4 × M2
For Iby = 1 To Nbyc
I0by = Iby - 1
I0by = I0by * Nbyc
For Jby = 1 To Nbyc
Ijby = I0by + Jby
M5(ijby) = 0
For Kby = 1 To Nbyc
K0by = Kby - 1
K0by = K0by * Nbyc
Kjby = K0by + Jby
Ikby = I0by + Kby
Jsi = M4(ikby) * M2(kjby)
M5(ijby) = M5(ijby) + Jsi
Next Kby
Next Jby
Next Iby
'---------------------------' 用M3,M5覆蓋矩陣M1,M2
For Iby = 1 To Nbyc
I0by = Iby - 1
I0by = I0by * Nbyc
For Jby = 1 To Nbyc
Ijby = I0by + Jby
M2(ijby) = M5(ijby)
M1(ijby) = M3(ijby)
If Iby = Jby Then ' 重建單位矩陣 M4
M4(ijby) = 1
Else
M4(ijby) = 0
End If
Next Jby
Next Iby
Next Rby
'-------------------------------' 矩陣乘法 B = M1×M2
For Iby = 1 To Nbyc
I0by = Iby - 1
I0by = I0by * Nbyc
For Jby = 1 To Nbyc
J0by = Jby - 1
J0by = J0by * Nbyc
Ijby = I0by + Jby
B(ijby) = 0
For Kby = 1 To Nbyc
K0by = Kby - 1
K0by = K0by * Nbyc
Ikby = I0by + Kby
Kjby = K0by + Jby
Jsi = M1(ikby) * M2(kjby)
B(ijby) = B(ijby) + Jsi
Next Kby
Next Jby
Next Iby
End Sub
'*******************************************************************************
'******************************* 打印矩陣 **************************************
'*******************************************************************************
Sub Matprint(byval Ksi As Single)
Jby = 0 : Kby = 0
If Ksi = A(1) Then
Kby = 1
Elseif Ksi = B(1) Then
Kby = 2
Elseif Ksi = C(1) Then
Kby = 3
End If
For Iby = 1 To Mbyc
Select Case Kby
Case 1
Msi = A(iby)
Case 2
Msi = B(iby)
Case 3
Msi = C(iby)
Case Else
Exit Sub
End Select
If Msi >= 0 Then
Print " ";
End If
Print Fusing(msi , "#.##") ; " ";
Incr Jby
If Jby = Nbyc Then
Print
Jby = 0
End If
Next Iby
End Sub