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

本文关键字:数组 ILArray 转换 | 更新日期: 2023-09-27 18:36:55

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

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

我需要得到一个double[,] System.Array.

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

目前在

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:错误修正:使用Marshal.Sizeof(T)而不是sizeof(double)@Edit:错误修复:现已修复修复:使用元帅大小(类型(T))