从C API接收多维数组,如何在Swift中处理?

6

我在我的Swift应用程序中使用了一个C库,但我无法弄清楚如何获取C方法应该返回的多维数组。

我从C API中收到了以下内容:

struct resultArray
{
    double *data;
    int size[2];
};

在哪里:

size = 矩阵大小,一个包含行数和列数的二元数组

data = 矩阵数据

在Swift中,我可以通过以下方式获取大小:

let numRows = Int(results.size.0)
let numColoumns = Int(results.size.1)

但我不明白如何获取矩阵以便可以进行迭代?我尝试了以下操作:

let matrixResult = results.data.memory

这似乎只返回一个double值,因为matrixResult变成了Double类型。

然后我尝试了这个:

let matrixResult = results.data

这使得matrixResult成为:
UnsafeMutablePointer<Double>

根据C库的文档,我希望收到一个矩阵。然后我想遍历这个矩阵,获取第一行的值并将其放入Swift数组中... 有人知道我缺少什么吗?

2个回答

4

C语言中没有矩阵类型。假设data是指向以数组形式存储的连续矩阵元素的指针,您可以将第一行复制到Swift数组中。

let firstRow = Array(UnsafeBufferPointer(start: results.data, count: numColumns))

将整个“矩阵”转换为嵌套的Swift数组。
let matrix = (0 ..< numRows).map { row in
    Array(UnsafeBufferPointer(start: results.data + numColumns * row, count: numColumns))
}

或者(这与Melifaro建议的类似),您可以创建一个指向矩阵行的指针数组:

let matrix = (0 ..< numRows).map { row in
    UnsafeBufferPointer(start: results.data + numColumns * row, count: numColumns)
}

这仍然允许以类似矩阵的方式处理任意元素。
 let element = matrix[row][col]

但不会复制数据。当然,这需要在使用matrix期间矩阵数据始终有效,因为Swift不管理内存。


这个有效!谢谢,终于我明白这里发生了什么。 - juppy

3

顺便提一下,如果你在处理大数据集,直接使用C结构处理数据比在Swift数据结构中复制数据更有意义。因此,实现相同效果的另一种方法是:

let (I, J) = res.size

for i in 0..<I {
    for j in 0..<J {
        let v = res.data.advancedBy(Int(j + i * J))
        let d: Double = v.memory
        print("[\(i), \(j)]: \(d)")
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接