簡體   English   中英

從C api接收多維數組,如何在Swift中處理?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM