[英]Receiving multidimensional array from C api, how to handle in Swift?
我在我的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數組中...有人知道我在這里缺少什么嗎?
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管理的。
順便說一句,如果你使用龐大的數據集,直接處理C-Structure中的數據是有意義的,而不是在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)")
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.