1

我正在使用 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; }

没有退货声明?

在上述示例中,可以通过以下实例方法修改 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 以执行数组操作?我倾向于避免这条路,或者我想尽可能地限制它。

4

1 回答 1

1

文档部分“ ILArray 和类”已更新。如您所述,示例代码中存在错误。

将 ILArray 实例修改为类成员

通过遵循文档中描述的规则,所有数组成员的类型都是 ILArray(或 ILLogical 或 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 很容易。如果 System.Array 适合存储方案(即,如果它是一维的),则 ILArray 将直接使用 System.Array。但反之则效率不高。它通常涉及数据的副本,并且 ILNumerics 内存管理也不能有效地工作。

这就是为什么我们建议继续使用 ILArray 等。如您所见,有一些规则需要牢记,但通常您会很快内化它们。

于 2014-07-27T18:26:01.323 回答