gpt4 book ai didi

c# - 解释 Func 中的二维数组

转载 作者:行者123 更新时间:2023-11-30 20:28:39 26 4
gpt4 key购买 nike

我正在使用 Accord 数学求解具有非线性约束的非线性函数问题是 NonlinearObjectiveFunction函数接受参数 function那是 Func<double[], double> function就我而言,它类似于

x =>
x[0] * (Matrix[0, 0] * x[0] + Matrix[1, 0] * x[1] + Matrix[2, 0] * x[2]) +
x[1] * (Matrix[0, 1] * x[0] + Matrix[1, 1] * x[1] + Matrix[2, 1] * x[2]) +
x[2] * (Matrix[0, 2] * x[0] + Matrix[1, 2] * x[1] + Matrix[2, 2] * x[2])

是否有可能以某种方式构建这个 function使用循环?因为输入矩阵的维度可以改变。

class Program
{
static void Main(string[] args)
{
double[,] Matrix = new double[3, 3];

Matrix[0, 0] = 0.00234329;
Matrix[0, 1] = 0.00118878;
Matrix[0, 2] = 0.00152143;
Matrix[1, 0] = 0.00118878;
Matrix[1, 1] = 0.00206312;
Matrix[1, 2] = 0.00124812;
Matrix[2, 0] = 0.00152143;
Matrix[2, 1] = 0.00124812;
Matrix[2, 2] = 0.00194796;

double x1 = 0.0107;
double x2 = -0.00054;
double x3 = -0.0034;

var f = new NonlinearObjectiveFunction(3, x =>
x[0] * (Matrix[0, 0] * x[0] + Matrix[1, 0] * x[1] + Matrix[2, 0] * x[2]) +
x[1] * (Matrix[0, 1] * x[0] + Matrix[1, 1] * x[1] + Matrix[2, 1] * x[2]) +
x[2] * (Matrix[0, 2] * x[0] + Matrix[1, 2] * x[1] + Matrix[2, 2] * x[2])
);

var constraints = new[]
{
new NonlinearConstraint(3, x => x1 * x[0] + x2 * x[1] + x3 * x[2] >= 0.01),
new NonlinearConstraint(3, x=> x[0] + x[1] + x[2]>=1 ),
new NonlinearConstraint(3, x=> x[0] + x[1] + x[2]<=1 ),
new NonlinearConstraint(3, x=> x[0]>=0),
new NonlinearConstraint(3, x=> x[1]>=0),
new NonlinearConstraint(3, x=> x[2]>=0)
};

var cobyla = new Cobyla(f, constraints);
bool success = cobyla.Minimize();
double minimum = cobyla.Value;
double[] solution = cobyla.Solution;
}
}

最佳答案

您在代码示例中显示的 lambda 表达式可以这样重写:

double ApplyMatrix(double[,] matrix, double[] x)
{
double sum = 0;

for (int row = 0; row < matrix.GetLength(1); row++)
{
double rowSum = 0;

for (int col = 0; col < matrix.GetLength(0); col++)
{
rowSum += matrix[col, row] * x[col];
}

sum += x[row] * rowSum;
}

return sum;
}

然后,您可以将 lambda 表达式传递给使用上述内容的 NonlinearObjectiveFunction:

var f = new NonlinearObjectiveFunction(3, x => ApplyMatrix(Matrix, x));

当然,这假设您的用户定义的 Matrix 和传递给您的方法的 x 数组的维度彼此一致。 IE。您的用户定义矩阵始终是正方形,并且 x 数组始终至少包含与用户定义矩阵中的行和列一样多的元素。

如果这不是您要问的问题,请通过更准确地描述您要完成的目标来改进您的问题,包括解释您所说的“周期”.

关于c# - 解释 Func<double[]> 中的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47005172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com