在递归函数中声明新变量
Declaring new variable in recursive function
我正在尝试在 VBScript 中实现 Strassen 的矩阵乘法算法。但是我在递归方面遇到了很多问题。
在以下递归算法中:
Function multiply(matrixA, matrixB)
Dim n
n = UBound(matrixA) + 1
ReDim R(n - 1, n - 1)
If (n = 1) Then
R(0,0) = matrixA(0,0) * matrixB(0,0)
Else
ReDim A11(n/2 - 1, n/2 - 1)
ReDim A12(n/2 - 1, n/2 - 1)
ReDim A21(n/2 - 1, n/2 - 1)
ReDim A22(n/2 - 1, n/2 - 1)
ReDim B11(n/2 - 1, n/2 - 1)
ReDim B12(n/2 - 1, n/2 - 1)
ReDim B21(n/2 - 1, n/2 - 1)
ReDim B22(n/2 - 1, n/2 - 1)
Call PartitionMatrix(matrixA, A11, 0, 0)
Call PartitionMatrix(matrixA, A11, 0, n/2 - 1)
Call PartitionMatrix(matrixA, A21, n/2 - 1, 0)
Call PartitionMatrix(matrixA, A22, n/2 - 1, n/2 - 1)
Call PartitionMatrix(matrixB, B11, 0, 0)
Call PartitionMatrix(matrixB, B12, 0, n/2 - 1)
Call PartitionMatrix(matrixB, B21, n/2 - 1, 0)
Call PartitionMatrix(matrixB, B22, n/2 - 1, n/2 - 1)
Dim M1, M2, M3, M4, M5, M6, M7
M1 = multiply(AddMatrix(A11, A22), AddMatrix(B11, B22))
M2 = multiply(AddMatrix(A21, A22), B11)
M3 = multiply(A11, SubMatrix(B12, B22))
M4 = multiply(A22, SubMatrix(B21, B11))
M5 = multiply(AddMatrix(A11, A12), B22)
M6 = multiply(SubMatrix(A21, A11), AddMatrix(B11, B12))
M7 = multiply(SubMatrix(A12, A22), AddMatrix(B21, B22))
Wscript.Echo UBound(R) 'Returns only 0's in console
Dim C11, C12, C21, C22
C11 = AddMatrix(SubMatrix(AddMatrix(M1, M4), M5), M7)
C12 = AddMatrix(M3, M5)
C21 = AddMatrix(M2, M4)
C22 = AddMatrix(SubMatrix(AddMatrix(M1, M3), M2), M6)
Call JoinMatrix(C11, R, 0 , 0)
Call JoinMatrix(C12, R, 0 , n/2 - 1)
Call JoinMatrix(C21, R, n/2 - 1, 0)
Call JoinMatrix(C22, R, n/2 - 1, n/2 - 1)
End If
multiply = R
End Function
我正在将 multiply
函数的 return 值赋给变量 M1、M2 等。但是,我在 multiply
中 returning 的变量 R
似乎是从递归函数中继承过来的——就像它没有声明一个新矩阵 R
.从理论上讲,如果 R
每次在函数中声明它时都会获得一个新的内存位置,那么它根本不应该受到对乘法函数的递归调用的影响(我正在回显 UBound(R)
),但它是。我怎样才能确保 R
每次在递归中调用函数时实际上得到一个新的声明?
R
它没有在任何地方显式标注尺寸,因此它在函数外隐式标注尺寸,您只需在函数中重新标注它即可。
直接在 ReDim R(n - 1, n - 1)
上方插入 Dim R()
以在函数中显式标注它,它应该会按预期工作。
我正在尝试在 VBScript 中实现 Strassen 的矩阵乘法算法。但是我在递归方面遇到了很多问题。
在以下递归算法中:
Function multiply(matrixA, matrixB)
Dim n
n = UBound(matrixA) + 1
ReDim R(n - 1, n - 1)
If (n = 1) Then
R(0,0) = matrixA(0,0) * matrixB(0,0)
Else
ReDim A11(n/2 - 1, n/2 - 1)
ReDim A12(n/2 - 1, n/2 - 1)
ReDim A21(n/2 - 1, n/2 - 1)
ReDim A22(n/2 - 1, n/2 - 1)
ReDim B11(n/2 - 1, n/2 - 1)
ReDim B12(n/2 - 1, n/2 - 1)
ReDim B21(n/2 - 1, n/2 - 1)
ReDim B22(n/2 - 1, n/2 - 1)
Call PartitionMatrix(matrixA, A11, 0, 0)
Call PartitionMatrix(matrixA, A11, 0, n/2 - 1)
Call PartitionMatrix(matrixA, A21, n/2 - 1, 0)
Call PartitionMatrix(matrixA, A22, n/2 - 1, n/2 - 1)
Call PartitionMatrix(matrixB, B11, 0, 0)
Call PartitionMatrix(matrixB, B12, 0, n/2 - 1)
Call PartitionMatrix(matrixB, B21, n/2 - 1, 0)
Call PartitionMatrix(matrixB, B22, n/2 - 1, n/2 - 1)
Dim M1, M2, M3, M4, M5, M6, M7
M1 = multiply(AddMatrix(A11, A22), AddMatrix(B11, B22))
M2 = multiply(AddMatrix(A21, A22), B11)
M3 = multiply(A11, SubMatrix(B12, B22))
M4 = multiply(A22, SubMatrix(B21, B11))
M5 = multiply(AddMatrix(A11, A12), B22)
M6 = multiply(SubMatrix(A21, A11), AddMatrix(B11, B12))
M7 = multiply(SubMatrix(A12, A22), AddMatrix(B21, B22))
Wscript.Echo UBound(R) 'Returns only 0's in console
Dim C11, C12, C21, C22
C11 = AddMatrix(SubMatrix(AddMatrix(M1, M4), M5), M7)
C12 = AddMatrix(M3, M5)
C21 = AddMatrix(M2, M4)
C22 = AddMatrix(SubMatrix(AddMatrix(M1, M3), M2), M6)
Call JoinMatrix(C11, R, 0 , 0)
Call JoinMatrix(C12, R, 0 , n/2 - 1)
Call JoinMatrix(C21, R, n/2 - 1, 0)
Call JoinMatrix(C22, R, n/2 - 1, n/2 - 1)
End If
multiply = R
End Function
我正在将 multiply
函数的 return 值赋给变量 M1、M2 等。但是,我在 multiply
中 returning 的变量 R
似乎是从递归函数中继承过来的——就像它没有声明一个新矩阵 R
.从理论上讲,如果 R
每次在函数中声明它时都会获得一个新的内存位置,那么它根本不应该受到对乘法函数的递归调用的影响(我正在回显 UBound(R)
),但它是。我怎样才能确保 R
每次在递归中调用函数时实际上得到一个新的声明?
R
它没有在任何地方显式标注尺寸,因此它在函数外隐式标注尺寸,您只需在函数中重新标注它即可。
直接在 ReDim R(n - 1, n - 1)
上方插入 Dim R()
以在函数中显式标注它,它应该会按预期工作。