我的子程序与我的MMULT函数有什么不同/有什么问题?

我是编程和vba的初学者。

下面是我为协方差matrix编写的代码,作为一个很好的子程序:

Sub CovarMMULT() Dim Mean() As Double 'Declare array Mean Dim Excess() As Double 'Declare array Excess Dim ExcessTranspose() As Double 'Declare array ExcessTranspose Dim Covar() As Double 'Declare array Covar NoCol = Range("Returns").Columns.Count 'Count the number of columns from range name "Returns" NoRow = Range("Returns").Rows.Count 'Count the number of rows from the range name "Returns" ReDim Mean(NoCol - 1) As Double 'Re-declare size of array Mean 'Calculate average return For i = 0 To NoCol - 1 Mean(i) = WorksheetFunction.Average(Range("Returns").Columns(i + 1)) Next i ReDim Excess(NoRow - 1, NoCol - 1) As Double 'Re-declare size of array Excess Return 'Calculate excess return For Column = 0 To NoCol - 1 For Row = 0 To NoRow - 1 Excess(Row, Column) = Range("Returns").Cells(Row + 1, Column + 1) - Mean(Column) Next Row Next Column ReDim ExcessTranspose(NoCol - 1, NoRow - 1) As Double 'Re-declare size of array Excess Return Transpose 'Calculate Excess return transpose divided by number of rows of Excess return For Column = 0 To NoRow - 1 For Row = 0 To NoCol - 1 ExcessTranspose(Row, Column) = Excess(Column, Row) / NoRow Next Row Next Column ReDim Covar(NoCol - 1, NoCol - 1) As Double 'Re-declare Covariance Matrix array size 'Calculate the Covariance Matrix For ColumnVC = 0 To NoCol - 1 For RowVC = 0 To NoCol - 1 For Row = 0 To NoRow - 1 Covar(RowVC, ColumnVC) = Covar(RowVC, ColumnVC) + ExcessTranspose(ColumnVC, Row) * Excess(Row, RowVC) Next Row Next RowVC Next ColumnVC 'Output all results onto sheet Range("K14:P14").Value = Mean Range("K17:P26").Value = Excess Range("ExcessT").Value = ExcessTranspose Range("K37:P42").Value = Covar 'Test out Application.mmult Dim mmult As Variant mmult = Application.mmult(ExcessTranspose, Excess) Range("J58:O63").Value = mmult 

这里是我的教师用于构build类似于MMULTfunction的函数的代码:

 Function My_MMult(a, b) Dim ab() a_row = a.Rows.Count a_column = a.Columns.Count b_row = b.Rows.Count b_column = b.Columns.Count ReDim ab(a_row, b_column) For abrow = 1 To a_row For abcolumn = 1 To b_column For acolumn = 1 To a_column ab(abrow - 1, abcolumn - 1) = ab(abrow - 1, abcolumn - 1) + a(abrow, acolumn) * b(acolumn, abcolumn) Next acolumn Next abcolumn Next abrow My_MMult = ab() End Function 

对于这个相同的function,我尝试这样做,作为一个不同的方法来处理第0个数组的位置:

函数My_MMult(a,b)

 Dim ab() a_row = a.Rows.Count a_column = a.Columns.Count b_row = b.Rows.Count b_column = b.Columns.Count ReDim ab(a_row, b_column) For abrow = 0 To a_row - 1 For abcolumn = 0 To b_column - 1 For acolumn = 0 To a_column - 1 ab(abrow, abcolumn) = ab(abrow, abcolumn) + a(abrow, acolumn) * b(acolumn, abcolumn) Next acolumn Next abcolumn Next abrow My_MMult = ab() End Function 

我的问题是:

为什么我的函数无法输出正确的数字,但我的子程序工作正常?

为什么我不能使用“For abrow = 1 to a_row,而不得不使用ab(abrow – 1,abcolumn – 1)”,而不是使用“abrow = 0到a_row – 1并且有ab(abrow,abcolumn) ? 等等…?

我试着debugging我的function,结果发现错误发生在行内:

 ab(abrow, abcolumn) = ab(abrow, abcolumn) + a(abrow, acolumn) * b(acolumn, abcolumn) 

它出什么问题了?

最后,我想testing这个的原因是因为我发现当使用For i = 1 to whateverstoredcountedvariable时,它也计数为0,当在后面的方程中执行i-1时,将会有一个“空arrays位置”没有被用于存储数字里面,当我到达存储variables没有-1,这会浪费电脑的内存? 如果不是那么多,那么永远不要,但我很好奇,我怎么能通过不包括多余的空arrays位置到我的代码100%的效率。 所以这是我提出的目的。

编辑它的工作! 我把这个函数改成:

 Function My_MMult2(a, b) Dim ab() a_row = a.Rows.Count a_column = a.Columns.Count b_row = b.Rows.Count b_column = b.Columns.Count ReDim ab(a_row, b_column) For abrow = 0 To a_row - 1 For abcolumn = 0 To b_column - 1 For acolumn = 0 To a_column - 1 ab(abrow, abcolumn) = ab(abrow, abcolumn) + a(abrow + 1, acolumn + 1) * b(acolumn + 1, abcolumn + 1) Next acolumn Next abcolumn Next abrow My_MMult2 = ab() End Function 

现在我只是想知道为什么子程序不需要通过+1。