我尝试将程序放入VBA,但我一直收到错误。这一行突出显示:
B(i, j) = C(i, j) + A(i + 1, j) * A(i, j + 1)
我试图将两个相同的矩阵相乘,然后将其添加到自身。
假设我想要乘以15 x 15矩阵,除了更改尺寸和范围外,我会使用相同的代码吗?
Sub testing()
Dim A As Variant
Dim B(1 To 2, 1 To 2)
Dim C(1 To 2, 1 To 2)
A = Range("A1:B2").Value
i = 1
C(1, 1) = 0
Do Until i = 3
j = 1
Do Until j = 3
C(i, j) = C(i, j) + A(i, j) * A(j, i)
**B(i, j) = C(i, j) + A(i + 1, j) * A(i, j + 1)**
j = j + 1
Loop
i = i + 1
Loop
Range("E1:F2").Value = B
End Sub
谢谢!
答案 0 :(得分:0)
Do...Loop
不适合这项工作。请改用For...Next
。此外,为了帮助确保不会超出数组边界并使下标超出范围错误,您可以使用LBound
和UBound
而不是对索引边界进行硬编码。这样,如果更改输入矩阵的大小,则无需更改代码。
这将让你成为一部分。为简单起见,我假设A
是一个方阵。
Dim i As Long, j As Long
Dim A As Variant
Dim B() As Variant
Dim C() As Variant
A = Range("A1:B2").Value
ReDim B(LBound(A, 1) To UBound(A, 1), LBound(A, 2) To UBound(A, 2))
ReDim C(LBound(A, 1) To UBound(A, 1), LBound(A, 2) To UBound(A, 2))
For i = LBound(A, 1) To UBound(A, 1)
For j = LBound(A, 2) To UBound(A, 2)
C(i, j) = C(i, j) + A(i, j) * A(j, i)
B(i, j) = C(i, j) + A(i + 1, j) * A(i, j + 1) ' still bad
Next j
Next i
现在,由于i+1
和j+1
索引,您仍然会在同一行上收到错误。那些将在某个时刻具有值3,这超出了你的数组范围2.我无法帮你修复那条线,因为我不明白你想用它做什么。
这让我想到了下一点:如果您认为自己正在使用此行进行matrix multiplication
C(i, j) = C(i, j) + A(i, j) * A(j, i)
那你错了。正确的定义是:
这不是你实施的。
可能更方便的方法是使用内置的MMult
函数:
C = WorksheetFunction.MMult(A, A)