在LINQ C#中计算数组

Esc*_*tor 4 c# linq arrays

我想用linq用单个短语计算相关矩阵.我怎么能这样做(如果可能的话)?

假设我已经有一个名为volatilites的大小为N的数组,而返回是一个锯齿状数组,其中N个数组的大小都相同.

我也在使用:

using stats = MathNet.Numerics.Statistics.ArrayStatistics
Run Code Online (Sandbox Code Playgroud)

这是我想在LINQ中创建的代码:

double[,] correlation_matrix = new double[N,N];
for (int i=0; i<N;i++){
    for (int j = i + 1; j < N; j++){
        correlation_matrix [i,j]= stats.Covariance(Returns[i], Returns[j]) / (volatilities[i] * volatilities[j]); // stores it to check values       
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Jer*_*iel 6

如果您让自己拥有一组数组,那么您可以这样做

var correlation_matrix = 
    Returns.Select((r_i, i) => 
        Returns.Where((r_j, j) => j > i).Select((r_j, j) =>
            stats.Covariance(r_i, r_j) / (volatilities[i] * volatilities[j])
        ).ToArray()
    ).ToArray();
Run Code Online (Sandbox Code Playgroud)

如果你想使用范围(根据你的评论),你可以这样做

var N = Returns.Length;
var correlation_matrix = 
    Enumerable.Range(0, N).Select(i => 
        Enumerable.Range(i + 1, N - i - 1).Select(j =>
            stats.Covariance(Returns[i], Returns[j]) / (volatilities[i] * volatilities[j])
        ).ToArray()
    ).ToArray();    
Run Code Online (Sandbox Code Playgroud)

这并不是说你应该这样做.循环版本更具可读性和更高性能.

  • 我几乎不愿意为此+1,因为你说原版是如此好.但你确实说原件更好,所以+1.:) (3认同)