一、前言:
在算迴歸時,有使用到矩陣計算,所以小編分享一下矩陣乘法計算;
矩陣乘法一開始我在寫的時候是用雙迴圈概念,後來發現不對,有些組合永遠跑不到,所以改成用陣列方式來完成;目前還沒想到如何多矩陣相乘,還停在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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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後,點選按鈕後,會有對話框做如下操作。
以前老長官名言"問題僅有一個,方法有好幾個"
似乎在程式語言當中,也是這樣,小編簡單整理與紀錄自己的小作品
沒有留言:
張貼留言