使用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的各种排列,但都没有成功。
答案 0 :(得分:2)
收缩ILNumerics数组的文档说:
范围定义必须解决整个维度 - 除了要删除的所有维度之外的所有维度。
您想要从第二维移除后半部分。因此,您必须为所涉及的所有其他维度定义完整范围。这里,由于帧是矩阵,因此只有2个维度。因此,第一个必须得到充分解决。
使用C#索引器应该更容易。以下示例假定您的代码位于从ILMath派生的类中。否则,请在所有ILMath.
,full
和r
函数/属性之前添加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的长度。