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

时间:2014-07-27 17:32:48

标签: c# instance-variables ilnumerics instance-methods

我正在使用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以执行数组操作?我倾向于避开这条道路,或者我想尽可能地限制它。

1 个答案:

答案 0 :(得分:1)

文档部分“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属性的assignemens)和类(readonly ILArray<T>声明,ILMath.localMember<T>初始化)你可以自由地混合两种方案。它将双向工作并立即重用所有不需要的内存。

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

这就是我们建议继续使用ILArray之类的原因。如您所见,要记住一些规则,但通常您会很快将其内化。