英文:
How do I access the values inside a MATLAB array using Cgo?
问题
使用MatLab C API和Go的Cgo包,我正在尝试在我的Go程序中读取一个24x3000000的矩阵内的mat文件。我能够成功读取矩阵的维度,但是如何访问每个单元格内的值呢?(最终目标是将该矩阵作为切片返回给我的Go程序。)
var realDataPtr *C.double
var field *C.mxArray
fieldName := C.CString("data")
field = C.mxGetField(pa, 0, fieldName)
rowTotal := C.mxGetM(field) // 输出为24
colTotal := C.mxGetN(field) // 输出为3000000
// 获取矩阵中数据的指针
realDataPtr = C.mxGetPr(field)
// 打印矩阵中的每个元素
for row := 0; row < int(rowTotal); row++ {
for col := 0; col < int(colTotal); col++ {
// 这是我卡住的地方
}
}
参考资料:这里是C语言的矩阵库API。
英文:
Using the MatLab C API and Go's Cgo package, I'm attempting to read a 24x3000000 matrix inside a mat-file in my Go program. I'm able to successfully read the dimensions of the matrix but how do I access the values inside each cell? (The goal is ultimately to return this matrix as a slice to my Go program.)
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
}
}
For reference, here's the Matrix Library API for C
答案1
得分: 1
MATLAB中的矩阵数据以列优先顺序存储,这意味着数据的列按顺序存储在内存中(与C和类似的语言相反)。因此,如果你想在C中按顺序访问数据(很遗憾,我对Go语法不太熟悉),你可以这样做:
for(col=0;col<colTotal;++col)
{
for(row=0;row<rowTotal;++row)
{
data = realDataPtr[col*rowTotal + row];
}
}
英文:
Matrix data in MATLAB are stored in column major order, which means that the columns of the data are stored in sequential order in memory (this is the opposite to C and similar languages). Thus, if you wanted to access the data sequentially in C (I'm not immediately familiar with Go syntax, unfortunately), you could do the following:
for(col=0;col<colTotal;++col)
{
for(row=0;row<rowTotal;++row)
{
data = realDataPtr[col*rowTotal + row];
}
}
答案2
得分: 1
未经测试,因为我没有MatLab。例如,
import (
"fmt"
"unsafe"
)
// 打印矩阵中的每个元素
ptr := uintptr(unsafe.Pointer(realDataPtr))
for col := 0; col < int(colTotal); col++ {
for row := 0; row < int(rowTotal); row++ {
// 这是我卡住的地方
elem := *(*float64)(unsafe.Pointer(ptr))
fmt.Println(elem)
ptr += 8
}
}
英文:
Untested, since I don't have MatLab. For example,
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
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论