如何将 ILArray 转换为 double[,] 数组
一直ILArray<double> A
想用A.ToArray()
,不知道怎么用
我需要得到一个double[,] System.Array
.
如何将 ILArray 转换为 double[,] 数组
一直ILArray<double> A
想用A.ToArray()
,不知道怎么用
我需要得到一个double[,] System.Array
.
目前在 ILNumerics中没有自然支持将 aILArray<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:错误修复:现在修复了修复:使用 Marshal.Sizeof(typeof(T))