0

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

4

1 回答 1

2

缩小 ILNumerics 数组的文档说:

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

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

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

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 的长度。

于 2014-01-28T10:32:52.820 回答