<转>C#数组的 Length 和 Count()

C#数组的 Length 和 Count()

C# 数组中 Length 表示数组项的个数,是个属性。而 Count() 也是表示项的个数,是个方法,它的值和 Length 一样。
但实际上严格地说, Count() 不是数组的内容,而是 IEnumerable 的内容。这也是为什么 C# 2.0 时数组不能用 Count(),而 3.0 后就可以用 Count() 的原因。

对于数组,据说用 Length 快于 Count()。

所以一般情况:数组我用 Length,IEnumerable(比如 List)我用 Count()。

文章来源: 千一网络的vkvi —— http://www.cftea.com

C#中实现非线性回归方法可以使用MathNet.Numerics库,该库提供了许多数学计算的方法,包括线性和非线性回归。 首先安装MathNet.Numerics库,可以在NuGet包管理器中搜索安装。 下面是一个简单的示例代码,其中包含一个非线性回归方法。方法名为NonlinearRegression,传入参数为一个函数Func<Vector<double>, Vector<double>>,一个Vector<double>类型的数据集和一个double数组。 ```csharp using MathNet.Numerics.LinearAlgebra; public static class Regression { public static Vector<double> NonlinearRegression(Func<Vector<double>, Vector<double>> function, Vector<double> data, double[] target) { var jacobian = Matrix<double>.Build.Dense(target.Length, data.Count); var residuals = Vector<double>.Build.Dense(target.Length); var parameters = Vector<double>.Build.Dense(data.Count); for (int i = 0; i < target.Length; i++) { var x = data[i]; var y = target[i]; // Calculate the residual residuals[i] = y - function(x)[0]; // Calculate the Jacobian matrix for (int j = 0; j < data.Count; j++) { jacobian[i, j] = (function(x + Epsilon(j)) - function(x - Epsilon(j)))[0] / (2 * Epsilon(j)); } } // Solve for the parameters var qr = jacobian.QR(); var q = qr.Q; var r = qr.R; var qTranspose = q.Transpose(); var b = qTranspose * residuals; var c = qTranspose * jacobian; var parametersDelta = r.Solve(c.Transpose() * b); parameters -= parametersDelta; return parameters; } private const double EpsilonValue = 1e-8; private static readonly Vector<double> EpsilonVector = Vector<double>.Build.Dense(1, EpsilonValue); private static Vector<double> Epsilon(int index) { var result = Vector<double>.Build.Dense(index, 0); result = result.Append(EpsilonVector); result = result.Append(Vector<double>.Build.Dense(EpsilonVector.Count - index - 1, 0)); return result; } } ``` 在上面的代码中,使用了MathNet.Numerics库中的Matrix和Vector类来处理矩阵和向量数据。方法中的代码可以按照以下步骤完成: 1. 初始化Jacobian矩阵、残差向量和参数向量。 2. 通过循环遍历数据集,计算出每个数据点的残差,并且计算Jacobian矩阵。 3. 使用QR分解求解参数向量的最小二乘解。 4. 返回参数向量。 这个方法可以用于任何非线性回归问题。只需要将函数作为第一个参数传递给该方法,它会自动计算Jacobian矩阵和最小二乘解。 使用示例: ```csharp // Define the function var function = new Func<Vector<double>, Vector<double>>(x => Vector<double>.Build.DenseOfArray(new[] { x[0] * Math.Sin(x[0]), Math.Cos(x[0]) })); // Create the dataset var data = Vector<double>.Build.DenseOfArray(new[] { 0.1, 0.2, 0.3, 0.4, 0.5 }); var target = new[] { 0.078, 0.149, 0.217, 0.282, 0.342 }; // Perform the nonlinear regression var parameters = Regression.NonlinearRegression(function, data, target); // Output the results Console.WriteLine("Parameters: [{0}]", string.Join(", ", parameters)); ``` 这个示例代码中,我们定义了一个函数,然后生成一个数据集和目标值数组。最后调用非线性回归方法,得到最优参数向量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值