2014-01-27 71 views
0

使用ILNumerics,我试图以最有效的方式采用ILArray <>的前n列。删除ILArray <>元素

using(ILScope.Enter(inframe) 
{ 
    ILArray<complex> frame = ILMath.check(inframe); 
    int[] dims = frame.Size.ToIntArray(); //frame is a 2d ILArray 
    frame.SetRange(complex.Zero, dims[0] -1 , (dims[1] * 2 - 1)); //doubles the size of the array with zeros. 
    //TODO- various computations. 
    frame.SetRange(null, dims[0], dims[1] - 1); //EXCEPTION: why doesn't this work? 
} 

在这个例子中,我想只取帧的前半部分,但是我无法将其大小恢复为原始大小。我尝试了各种基于http://ilnumerics.net/ArrayAlter.html的排列,但都没有成功。

回答

2

为ILNumerics阵列的收缩文档说:

范围定义必须解决全尺寸 - 对于除了一个,其要被去除的所有尺寸。

您想从第二维中删除后半部分。因此,您必须为涉及的所有其他维度定义完整范围。这里,由于框架是一个矩阵,所以只有2个维度。因此,首先必须得到充分解决。

它应该通过使用C#索引器更容易工作。以下示例假定您的代码来自派生自ILMath的类。否则,所有的fullrend功能/性能前添加ILMath.

A[full, r(end/2, end)] = null; 

当心“关闭一个”的错误,并与“结束”寻址。您可能想用end/2 + 1代替?

既然你想要最有效的方式,性能似乎对你很重要。在这种情况下,您应该尝试防止扩展和缩小阵列!最好使用两个不同大小的数组:大一个和原始数组。相应地复制数据。扩大和缩小无论如何都会复制数据,所以这不是一个缺点。此外,这里不需要frame.Size.ToIntArray()。对于尺寸0和1的长度,只需使用frame.S[0]frame.S[1]

相关问题