excel - 仅将一个矩阵中的对角线值(其他单元格中的零)返回到另一个具有相同维度的矩阵

标签 excel vba matrix covariance

我必须通过收缩因子(lambda)将方差 - 协方差矩阵中的值缩小到方差(矩阵中的对角线值),所以:
lambda*shrinkagematrix+(1-lambda)*variancecovariancematrix,其中:

方差协方差矩阵为:

Function VarCovar(rng As Range) As Variant
    Dim i As Integer
    Dim j As Integer
    Dim numcols As Integer

    numcols = rng.Columns.Count
    numrows = rng.Rows.Count

    Dim matrix() As Double
    ReDim matrix(numcols - 1, numcols - 1)

    For i = 1 To numcols
        For j = 1 To numcols
            matrix(i - 1, j - 1) = Application.WorksheetFunction.Covar(rng.Columns(i), rng.Columns(j)) * numrows / (numrows - 1)
        Next j
    Next i
    VarCovar = matrix

,这给了我一个看起来像这样的矩阵:
 0.40  -0.10  0.11                                                 
-0.10   0.17 -0.03                                              
 0.11  -0.03  0.19 

然后我无法创建应该如下所示的收缩矩阵:
0.40  0.00  0.00                                      
0.00  0.17  0.00                                              
0.00  0.00  0.19 

即仅返回对角线值(=变量的方差)和所有其他单元格中的零。

因此,以某种方式,使其返回一个矩阵,该矩阵仅包含行 = 列数时的值,即
(1,1)、(2,2) 和 (3,3) 值。

任何人都可以帮助解决这个问题?

最佳答案

您只需要一个从 i = 1 to 3 开始计数的循环填写Matrix(1, 1) , Matrix(2, 2)Matrix(3, 3)使用 Matrix(i, i)

Function VarCovar(InputMatix As Range) As Variant
    Dim MatrixColumns  As Long
    MatrixColumns = InputMatix.Columns.Count

    Dim MatrixRows  As Long
    MatrixRows = InputMatix.Rows.Count

    Dim Matrix() As Double
    ReDim Matrix(1 To MatrixColumns, 1 To MatrixColumns)

    Dim i As Long
    For i = 1 To MatrixColumns
        Matrix(i, i) = Application.WorksheetFunction.Covar(InputMatix.Columns(i), InputMatix.Columns(i)) * MatrixRows / (MatrixRows - 1)
    Next i

    VarCovar = Matrix
End Function

请注意,我更改了 Matrix尺寸 Matrix(1 To MatrixDimension, 1 To MatrixDimension)1 开始而不是 0因此您可以轻松地使用它将其写入单元格:
Sub test()

    Range("A5:C7").Value = VarCovar(Range("A1:C3"))

End Sub

关于excel - 仅将一个矩阵中的对角线值(其他单元格中的零)返回到另一个具有相同维度的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55413472/

相关文章:

javascript - 检查计算岛屿的异常情况

excel - 如何从多个日期/时间创建平均时间长度?

excel - .选定的命令形式 Excel

python - 查看非常大的 CSV 文件的一部分?

excel - 是否可以从位于网络文件夹中的文件加载 VBA 代码?

matlab - 识别矩阵中相同数字的序列

arrays - 从函数返回对象数组 - VBA

vba - 如果VBA中存在数字,如何删除txt文件中的一行

excel - 在 Excel vba 中读取单元格值并写入另一个单元格

c - NxN矩阵行列式递归问题