代码之家  ›  专栏  ›  技术社区  ›  alea_iacta_est

ILNumerics:ILArray<T>作为实例变量;

  •  1
  • alea_iacta_est  · 技术社区  · 10 年前

    我使用ILNumerics表示一些时间序列。

    理想情况下,我希望将所有数据封装为面向对象的,因此,使用实例变量和实例方法来处理这些变量。

    我有几个问题,但都与在类中以有效的方式实现ILArray的最佳方式有关,并且可能作为实例变量。我已经阅读了相关文档并检查了之前的SO示例,但似乎没有一个明确解决这些问题。

    第一个:网站上为“阵列利用率类”建议的示例 [来源: http://ilnumerics.net/ClassRules.html ]至少在ILNumerics试用版和VS 2013专业版(.net 4.5)中,似乎没有编译。我遗漏了什么吗?

    还是因为这部分代码:

    public ILRetArray<double> A 
    {
      get 
      { 
        // lazy initialization 
        if (m_a.IsEmpty) 
        {
           m_a.a = ILMath.rand(100,100); 
        }
      }
      set { m_a.a = value; }
    

    没有return语句?

    在上述示例中,可以通过以下实例方法修改m_a数组:

    public void Do() 
    {
        using (ILScope.Enter()) 
        {
           // assign via .a property only!
           m_a.a = m_a + 2; 
        }
    }
    

    如何访问向量的特定组件:假设我们需要 m_a[0]=2.2;这会妨碍内存管理吗?

    一般来说,在我看来,使用ILNumerics的自然方式是通过静态方法,就像用Fortran(或可能用R/Matlab)编写代码一样:到目前为止,我就是这样使用它的。我是对的,还是将ILArray类型作为实例变量和相关方法的类定义应该是高效和直接的?

    或者,您是否建议采用System数组作为实例变量,然后仅通过静态方法导入/导出到ILarray以执行数组操作?我倾向于避免走这条路,或者我希望尽可能地把它限制住。

    1 回复  |  直到 10 年前
        1
  •  1
  •   Haymo Kutschbach    10 年前

    文档部分' ILArray and Classes '已更新。正如您所说的,示例代码中有一个错误。

    将ILArray实例修改为类成员

    通过遵循文档中描述的规则,所有阵列成员都将是ILArray(或ILlogic或ILCell)类型。这些类型是 易变的 类型。你可以在他们的一生中自由改变他们。 m_a[0] = 2.2; 按预期工作。您还可以决定完全替换阵列:

    m_a.a = ILMath.rand(2,3,5);  
    

    记住,不要简单 分配 但使用 .a = 财产或 .Assign() 方法。编译器将防止您错误地赋值,因为您已将数组声明为 readonly .

    这样的更改确实可以顺利地进行内存管理。

    混合静态方法和类实例

    只要您关注这两个函数的规则:函数(ILScope块、不同的输入参数数组类型、通过.a属性的赋值)和类( readonly ILArray<T> 公告 ILMath.localMember<T> 初始化),您可以自由混合这两种方案。它将双向工作,并立即重用所有不再需要的内存。

    将System.Array与 ILArray<T> 另一方面可能导致不利的分配模式。通常,很容易从System.Array创建ILArray。如果ILArray符合存储方案(即,如果是一维),则System.Array将直接由ILArray使用。但另一种方式效率不高。它通常涉及数据的副本,ILNumerics内存管理也无法有效工作。

    这就是为什么我们建议使用ILArray等。正如你所看到的,有一些规则需要记住,但通常你会很快将它们内化。

    推荐文章