删除ILArray<>分子

时间:2014-01-27 16:40:52

标签: c# exception ilnumerics

使用ILNumerics,我试图获取ILArray的前n列数<>以最有效的方式。

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的各种排列,但都没有成功。

1 个答案:

答案 0 :(得分:2)

收缩ILNumerics数组的文档说:

  

范围定义必须解决整个维度 - 除了要删除的所有维度之外的所有维度。

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

使用C#索引器应该更容易。以下示例假定您的代码位于从ILMath派生的类中。否则,请在所有ILMath.fullr函数/属性之前添加end

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

注意'off by one'错误并使用'end'解决。您可能想要使用end / 2 + 1代替?

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