如何将ILArray转换为double [,]数组?

时间:2013-10-26 15:20:12

标签: c# ilnumerics

如何将ILArray转换为double [,]数组

ILArray<double> A想要使用A.ToArray(),但不知道如何使用

我需要double[,] System.Array

1 个答案:

答案 0 :(得分:3)

目前,在ILNumerics中,将ILArray<double>转换为多维System.Array double[,]并不是很自然的支持。那就让我们写吧!

private static System.Array ToSystemMatrix<T>(ILInArray<T> A) {
    using (ILScope.Enter(A)) {
        // some error checking (to be improved...)
        if (object.Equals(A, null)) throw new ArgumentException("A may not be null");
        if (!A.IsMatrix) throw new ArgumentException("Matrix expected");

        // create return array
        System.Array ret = Array.CreateInstance(typeof(T), A.S.ToIntArray().Reverse().ToArray());
        // fetch underlying system array
        T[] workArr = A.GetArrayForRead();
        // copy memory block 
        Buffer.BlockCopy(workArr, 0, ret, 0, Marshal.SizeOf(typeof(T)) * A.S.NumberOfElements);
        return ret;
    }
}

此函数应适用于任意元素类型和任意大小/维度的任意ILArray<T>。 (但是,与往常一样,在生产之前应该进行大量测试!)它会创建一个具有所需大小和类型的新System.Array,并按照其自然(存储布局)顺序复制所有元素。返回的System.Array可以在之后被转换为真正的多维数组。

我们使用Buffer.BlockCopy来复制元素。请记住,System.Array以行主要顺序存储其元素。 ILNumerics(就像FORTRAN,Matlab和其他人一样)更喜欢列主要订单!因此,由于我们只是快速复制元素并且没有努力在内存中重新排序它们,因此输出数组将显示为与输入数组相比翻转尺寸:

ILArray<double> C = ILMath.counter(4, 3);
var exp = ToSystemMatrix<double>(C); 

exp的大小为[3 x 4]。对于矩阵,通过转置输入数组可以很容易地避免这种情况:

var exp = ToSystemMatrix<double>(C.T); 

@Edit:bugfix:使用Marshal.Sizeof(T)代替sizeof(double) @Edit:bugfix:现在修复了修复:使用了Marshal.Sizeof(typeof(T))