乘以矩阵(下标超出范围)

时间:2014-05-07 04:41:59

标签: excel vba excel-vba matrix

我尝试将程序放入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

谢谢!

1 个答案:

答案 0 :(得分:0)

Do...Loop不适合这项工作。请改用For...Next。此外,为了帮助确保不会超出数组边界并使下标超出范围错误,您可以使用LBoundUBound而不是对索引边界进行硬编码。这样,如果更改输入矩阵的大小,则无需更改代码。

这将让你成为一部分。为简单起见,我假设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+1j+1索引,您仍然会在同一行上收到错误。那些将在某个时刻具有值3,这超出了你的数组范围2.我无法帮你修复那条线,因为我不明白你想用它做什么。

这让我想到了下一点:如果您认为自己正在使用此行进行matrix multiplication

C(i, j) = C(i, j) + A(i, j) * A(j, i)
那你错了。正确的定义是:

Definition of the matrix product

这不是你实施的。

可能更方便的方法是使用内置的MMult函数:

C = WorksheetFunction.MMult(A, A)