如何轉換成ILArray雙[,]數組如何將ILArray轉換爲double [,]數組?
我ILArray<double> A
想使用A.ToArray()
,但不知道如何使用它
我需要一個double[,] System.Array
。
如何轉換成ILArray雙[,]數組如何將ILArray轉換爲double [,]數組?
我ILArray<double> A
想使用A.ToArray()
,但不知道如何使用它
我需要一個double[,] System.Array
。
當前沒有將ILArray<double>
轉換爲ILNumerics中的多維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和其他)更喜歡列主要的順序!所以,既然我們只是快速複製的元素,並做一切努力來重新排序在內存中,outcoming陣列將顯示爲相比具有翻轉輸入數組尺寸:
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(雙) @Edit:修正:現在固定的修正:使用Marshal.Sizeof(typeof(T))
Haymo我不能使這個函數工作。 Buffe.BlockCopy行似乎仍然存在錯誤。 Marshal.SizeOf(T)給出一個構建錯誤,Marshal.SizeOf(typeof(T))不給出構建錯誤,但不起作用 – nik
對。我編輯了代碼。它讀取'Marshal.Sizeof(typeof(T))'。請澄清哪些不起作用?考慮打開一個新的線程。 –
我已經打開了一個新線程 –
nik