2020年12月6日 星期日

VBA:矩陣計算(相乘)

一、前言:

在算迴歸時,有使用到矩陣計算,所以小編分享一下矩陣乘法計算;

矩陣乘法一開始我在寫的時候是用雙迴圈概念,後來發現不對,有些組合永遠跑不到,所以改成用陣列方式來完成;目前還沒想到如何多矩陣相乘,還停在2個矩陣相乘。

二、發想:

透過Application.InputBox來取的資料儲存格位置。

副程式:

矩陣相乘有一部分是要與前回計算結果相加,這部分單獨靠迴圈明顯不足,這邊先寫一個副程式,名稱叫MATRIX_CAL,透過丟入2個矩陣當參數方式,用來計算矩陣相乘積與加總和。

主程式:

A矩陣:用I迴圈堆壘第一個矩陣成A矩陣,

B矩陣:用J迴圈堆壘第二個矩陣成B矩陣,並用J迴圈控制呼叫MATRIX_CAL的次數,然後每次呼叫時把A與 B矩陣當引數丟給MATRIX_CAL。

輸出:使用之前小編寫的sheet_name_check_delete這個副程式,下文字資料的引數"矩陣相乘結果"做執行;新增表單後,透過新的I與J迴圈將計算結果寫入工作表中

三、來做做:

先做一個VBA的AxtiveX命令按鈕

然後貼上code:


'COPYRIGHT BY dropit.liu.
Private Sub CommandButton1_Click()
On Error GoTo LINE1
Dim Total As Variant
'取得儲存格資料
AA_INPUTBOX_address = Application.InputBox("選擇A矩陣的儲存格範圍", Type:=8).Address '取得位置
AA_INPUTBOX = ActiveSheet.Range(AA_INPUTBOX_address).Value '取得資料,但其實上一行就可以了,換一種寫法
Bb_INPUTBOX_address = Application.InputBox("選擇B矩陣的儲存格範圍", Type:=8).Address '取得位置
BB_INPUTBOX = ActiveSheet.Range(Bb_INPUTBOX_address).Value '取得資料
ReDim Total(1 To UBound(AA_INPUTBOX, 1), 1 To UBound(BB_INPUTBOX, 2)) As Variant
'暫存資料用
ReDim A(UBound(AA_INPUTBOX, 1))
ReDim B(UBound(BB_INPUTBOX, 1))
'計算
For I = LBound(AA_INPUTBOX) To UBound(AA_INPUTBOX) Step 1
For II = LBound(AA_INPUTBOX) To UBound(AA_INPUTBOX, 2) Step 1
A(II - 1) = AA_INPUTBOX(I, II)
Next II
For J = LBound(BB_INPUTBOX) To UBound(BB_INPUTBOX, 2) Step 1
For JJ = LBound(BB_INPUTBOX) To UBound(BB_INPUTBOX, 1) Step 1
B(JJ - 1) = BB_INPUTBOX(JJ, J)
Next JJ
MATRIX_CALOUT = MATRIX_CAL(A, B)
Total(I, J) = MATRIX_CALOUT
Next J
Next I
'輸出
Call sheet_name_check_delete("矩陣相乘結果")
Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "矩陣相乘結果"
For I = LBound(Total) To UBound(Total, 1)
For J = LBound(Total) To UBound(Total, 2)
If Total(I, J) <> "" Then
Sheets("矩陣相乘結果").Cells(I, J) = Total(I, J)
End If
Next J
Next I
Exit Sub
LINE1:
MsgBox "ERROR"
Resume
End Sub
Function MATRIX_CAL(A, B)
For I = LBound(A) To UBound(A) Step 1
MATRIX_CAL = MATRIX_CAL + A(I) * B(I)
Next
End Function

測試資料:

圖1.A與B矩陣

操作:貼上以上CODE後,點選按鈕後,會有對話框做如下操作。
 
圖2.A矩陣輸入(位置任選)

圖3.B矩陣輸入(位置任選)

圖4.結果

以前老長官名言"問題僅有一個,方法有好幾個"
似乎在程式語言當中,也是這樣,小編簡單整理與紀錄自己的小作品


沒有留言:

張貼留言

指數變化(2025.03.28)

 指數變化(2025.03.28) 上周焦點: 美國消費者信心指數 3/25 92.9 美國耐久財訂單月增率 3/26 1.4 PCE 月增 0.4 年增 2.8 (不多阿,最高還有5.5ㄝ)   本周愛看: 美國非農業就業人數變化 美國ISM製造業採購經理人指數 美國芝加哥FE...