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

本文关键字:实例 变量 ILArray ILNumerics | 更新日期: 2023-09-27 18:15: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; }

没有返回语句?

在上面提到的例子中,m_a数组可以通过以下实例方法修改:

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

如何访问vector的特定分量:假设我们想要M_a [0] = 2.2;这会妨碍内存管理吗?

作为一般观察,在我看来,使用ILNumerics的自然方式是通过静态方法,因为人们会在Fortran(或可能在R/Matlab)中编写代码:这就是我如何使用它,到目前为止。我是对的或类定义有ILArray类型作为实例变量和相关方法应该是有效和直接的吗?

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

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

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

将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>初始化),你可以自由地混合这两种方案。它将双向工作,并重用所有不再立即需要的内存。

混合集约使用系统。另一边有ILArray<T>的数组可能导致不利的分配模式。一般来说,从System.Array创建ILArray很容易。这个系统。Array将被ILArray直接使用,如果它适合存储方案(即,如果它是一维的)。但是反过来就不是很有效了。它通常涉及数据的副本,ILNumerics内存管理也不能有效地工作。

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