1

使用 MatLab C API 和 Go 的Cgo 包,我试图在我的 Go 程序的 mat 文件中读取 24x3000000 矩阵。我能够成功读取矩阵的维度,但如何访问每个单元格内的值?(最终目标是将此矩阵作为切片返回给我的 Go 程序。)

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
    }
}

作为参考,这里是C 的矩阵库 API

4

2 回答 2

1

MATLAB中的矩阵数据是按列主序存储的,这意味着数据的列是按顺序存储在内存中的(这与C和类似语言相反)。因此,如果您想在 C 中按顺序访问数据(不幸的是,我对 Go 语法并不熟悉),您可以执行以下操作:

for(col=0;col<colTotal;++col)
{
    for(row=0;row<rowTotal;++row)
    {
        data = realDataPtr[col*rowTotal + row];
    }
}
于 2014-11-02T01:48:29.820 回答
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
    }
}
于 2014-11-02T04:08:16.967 回答