2014-11-02 19 views
1

使用MatLab C API和Go的Cgo package,我試圖在我的Go程序中讀取mat文件中的24x3000000矩陣。我能夠成功讀取矩陣的維數,但是如何訪問每個單元格內的值? (我們的目標是最終返回此矩陣作爲一個切片到我的圍棋程序。)如何使用Cgo訪問MATLAB數組中的值?

var realDataPtr *C.double 
var field *C.mxArray 

fieldName := C.CString("data") 
field = C.mxGetField(pa, 0, fieldName) 

rowTotal := C.mxGetM(field) // outputs 24 
colTotal := C.mxGetN(field) // outputs 3000000 

// get pointer to data in matrix 
realDataPtr = C.mxGetPr(field) 

// Print every element in the matrix 
for row := 0; row < int(rowTotal); row++ { 
    for col := 0; col < int(colTotal); col++ { 
     // This is where I get stuck 
    } 
} 

僅供參考,here's在MATLAB對C

+1

'mxGetPr'返回一個指向一個常規的C數組類型的'double'長度爲24 * 300萬,存儲在列主順序 – Amro 2014-11-02 01:48:32

+1

你能告訴我們你在哪裏得到'field'部分?以下是從MAT文件讀取變量的示例:http://stackoverflow.com/a/26241535/97160。如果你想要的話,我可以展示另一個例子(在C中,恐怕我不知道Go),但是如果你給我們多一些上下文,陣列來自哪裏,這將有所幫助。 – Amro 2014-11-02 14:28:29

+0

@Amro I've更新了我的代碼,以顯示我在哪裏獲得'field'。出於某種原因'C.mxGetPr(field)'返回null。根據文件,這意味着沒有真實的數據。然而,我使用驗證方法['mxIsDouble'](http://www.mathworks.com/help/matlab/apiref/mxisdouble.html)和['mxIsNumeric'](http:// www。 mathworks.com/help/matlab/apiref/mxisnumeric.html)並且都返回true。 – 2014-11-02 14:52:24

回答

1

未經檢驗的,因爲我沒有MatLab的。例如,

import (
    "fmt" 
    "unsafe" 
) 

// Print every element in the matrix 
ptr := uintptr(unsafe.Pointer(realDataPtr)) 
for col := 0; col < int(colTotal); col++ { 
    for row := 0; row < int(rowTotal); row++ { 
     // This is where I get stuck 
     elem := *(*float64)(unsafe.Pointer(ptr)) 
     fmt.Println(elem) 
     ptr += 8 
    } 
} 
1

矩陣的數據矩陣庫API存儲在列優先順序,這意味着數據列按順序存儲在內存中(這與C和類似語言相反)。因此,如果你想訪問的數據依次在C(我不是立即熟悉圍棋的語法,不幸地),你可以做到以下幾點:

for(col=0;col<colTotal;++col) 
{ 
    for(row=0;row<rowTotal;++row) 
    { 
     data = realDataPtr[col*rowTotal + row]; 
    } 
} 
+1

應該是'col * rowCount'而不是'col * colCount' – 2014-11-02 01:59:06

+0

感謝澄清。有誰知道如何使用Cgo訪問realDataPtr內的值? – 2014-11-02 02:04:16

+0

@BenVoigt哎呀,好看點。謝謝。 – MrAzzaman 2014-11-02 02:34:34