更改特定元素时更新数组的值

时间:2016-02-15 13:48:43

标签: c# arrays algorithm newtons-method linear-interpolation

让我们假设我已经定义了一个名为computeValue (double x)的函数:

  1. ,其输入为双值
  2. 返回通过使用数组元素执行某组操作而获得的值,如下所述。
  3. 另外,我们有上面提到的数组

    1. 是一些班级成员
    2. 仅包含4个职位。
    3. 第一个位置包含一个特定值,第四个位置包含另一个值,它将作为我们函数的输入
    4. (这里是棘手的位),数组的第2和第3个值应该是数组位置1和4之间线性插值的结果。也就是说,如果我们修改数组的位置1或4,那么位置2和3应该根据插值方法自动改变它们的值。
    5. 我的目标是调用根寻找算法(例如Newton-Raphson,Secant Method等),旨在最小化以下表达式:

      f = CONSTANT - computeValue(array[4])
      

      正如您可能已经观察到的那样,问题是每次我的根查找例程修改我的数组的第4个元素以获得新的解决方案时,我的数组的位置2和3应该相应地修改,因为它们是插值的结果(如上面第4点所述),从而改变computeValue的结果。

      当根查找算法朝向根目录时,有什么方法可以使数组的值动态变化?也许与存储定义插值的lambda表达式的数组有关?

2 个答案:

答案 0 :(得分:2)

使用经典数组无法完成,但您可以实现自己的类型来解决问题。此类型在内部使用长度为4的数组,并通过

提供访问
<test>
  <tag0>
    <tag1 is="mine">
        <uselesstag>
            <tag3 is="mine">test</tag3>
        </uselesstag>
    </tag1>
    <tag2 is="mine">test2</tag2>
  </tag0>
</test>

在这里,您可以编写自己的getter和setter,以便在其他人更改后立即重新计算值。

答案 1 :(得分:1)

这似乎是创建自己的对象的绝佳时机,而不是让自己与数组索引混淆。您可以使用JF Meier's approach并手动创建或扩充数组类。但我建议完全创建一个新对象。您可以使插值点仅获得返回正确插值的属性。您的对象可能如下所示:

public class Interpolator
{
    public double Constant {get; set;} //same as your array[0]
    public double Value {get; set;}    //same as your array[3]

    public double Interpolation1 { get { return CalculateInterpolation1(); } }
    public double Interpolation2 { get { return CalculateInterpolation2(); } }

    private double CalculateInterpolation1()
    {
        //define your interpolation here
    }

    private double CalculateInterpolation2()
    {
        //define your interpolation here
    }       
}

简短的.Net Fiddle demo