Excel 仅将一个矩阵中的对角线值(其他单元格中为零)返回到具有相同尺寸的另一个矩阵

Excel 仅将一个矩阵中的对角线值(其他单元格中为零)返回到具有相同尺寸的另一个矩阵,excel,vba,matrix,covariance,Excel,Vba,Matrix,Covariance,我必须通过收缩因子(λ)将方差协方差矩阵中的值向方差(矩阵中的对角值)收缩,因此: λ*收缩矩阵+(1-λ)*方差矩阵,其中: 方差协方差矩阵为: 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

我必须通过收缩因子(λ)将方差协方差矩阵中的值向方差(矩阵中的对角值)收缩,因此: λ*收缩矩阵+(1-λ)*方差矩阵,其中:

方差协方差矩阵为:

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 
i、 e仅返回对角线值(=变量的方差)和所有其他单元格中的零

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


有人能帮上忙吗?

您只需要一个从
i=1到3
计数的循环,就可以使用
矩阵(i,i)
矩阵(2,2)
矩阵(3,3)
来填充
矩阵(i,i)

请注意,我将
矩阵
维度
矩阵(1到MatrixDimension,1到MatrixDimension)
更改为从
1
开始,而不是
0
,因此您可以轻松使用它将其写入单元格:

Sub test()

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

End Sub

如果在循环中有一个if语句if i=j then.value=0@Jo.lass为什么这么复杂?只要放下
j
循环,用
i
@Jo.lass替换
j
,你会把if语句放在编码的什么地方?@Pernille不要这样做,那会让你的代码变慢。我修正了我的答案,请看一下。谢谢你的帮助!我仍然有问题(很抱歉,我对VBA完全陌生,不完全了解所有编码),我有这个区域,比如A3:F27,它有不同变量的返回(6个变量,每个变量有24个观察值)。您刚才编写的函数不是作为:VarCovar(A3:F27)使用的,因为它附带消息“not symetric matrix”。然后我尝试将您的函数重命名为“VarCovarZeros”,并尝试:VarCovarZeros(VarCovar(A3:F27))其中VarCovar是“我的”原始函数。这将返回#值,i、 e.不工作。我需要将“原始数据”转换成一个矩阵,该矩阵只给出对角线上的方差和其他地方的零,或者将“我的”VarCovar矩阵转换成一个具有(1,1)、(2,2)、(3,3)。。。等。其中的值和其他地方的零。这有意义吗?@Pernille啊,我想我明白了。我更改了答案,请再试一次。
Sub test()

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

End Sub