【发布时间】:2014-12-28 23:35:14
【问题描述】:
使用 MatLab C API 和 Go 的 Cgo package,我试图在我的 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
}
}
供参考,here's C 矩阵库 API
【问题讨论】:
-
mxGetPr返回一个指向double类型的常规 C 数组的指针,长度为 24*3000000,以列优先顺序存储 -
你能告诉我们你得到
field的部分吗?下面是从 MAT 文件中读取变量的示例:stackoverflow.com/a/26241535/97160。如果您愿意,我可以展示另一个示例(在 C 语言中,恐怕我不知道 Go),但是如果您给我们更多关于数组来自哪里的上下文,这将有所帮助.. -
@Amro 我更新了我的代码以显示我在哪里得到
field。出于某种原因,C.mxGetPr(field)返回 null。根据文档,这意味着没有真实数据。但是,我使用验证方法mxIsDouble和mxIsNumeric测试了field,并且都返回 true。 -
哦,这可能是它。它没有显示在我的代码中,但我使用的是
matGetNextVariableInfo,根据文档,它只读取标题信息。我可能应该使用matGetVariable -
我使用
matGetNextVariable而不是matGetNextVariableInfo并且 C.mxGetPr(field) 不再返回 null。但是我仍然不确定如何在不使用指针自动增量的情况下访问这些值。 Go 不允许指针算术。