我使用ILNumerics来表示某些时间序列。
理想情况下,我希望将所有数据封装为面向对象的la对象,从而使用实例变量和实例方法来处理这些变量。
我有几个问题,但都涉及到在类中实现ILArray的最佳方法是什么,以有效的方式,并可能作为实例变量。我已经阅读了相关的文档并检查了前面的示例,但是似乎没有一个能明确地解决这些问题。
首先:在“阵列利用类”网站上提出的示例(来源: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 =2.2的东西;这会妨碍内存管理吗?
作为一般的观察,在我看来,使用ILNumerics的自然方式是通过静态方法,就像人们用Fortran (或者可能用R/Matlab)编写代码一样:到目前为止,我就是这样使用它的。以ILArray类型作为实例变量和相关方法的类定义是否正确?
或者,您是否建议采用系统数组作为实例变量,然后仅通过静态方法导入/导出到ILarray以执行数组操作?我倾向于避免这条路,或者我想尽可能地限制它。
发布于 2014-07-27 18:26:01
文档部分“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>混合使用可能会导致不利的分配模式。通常,从ILArray创建System.Array是很容易的。如果System.Array适合于存储方案(即,如果它是一维的),它将直接由ILArray使用。但反过来却不是很有效率。它通常涉及数据的副本,ILNumerics内存管理也不能有效地工作。
这就是为什么我们建议留在ILArray和类似的地方。正如你所看到的,有一些规则需要记住,但通常你会很快地将它们内化。
https://stackoverflow.com/questions/24983612
复制相似问题