我正在使用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以执行数组操作?我倾向于避开这条道路,或者我想尽可能地限制它。
答案 0 :(得分:1)
文档部分“ILArray and Classes”已更新。正如您所说,示例代码中存在错误。
遵循文档中描述的规则,所有数组成员都将是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之类的原因。如您所见,要记住一些规则,但通常您会很快将其内化。