Как прочитать значения SparseMatrix_Double в Swift 4? - PullRequest
0 голосов
/ 26 октября 2018

Как написать функцию для распечатки содержимого SparseMatrix_Double для Swift 4?

Пока у меня есть следующий код, но вывод будет правильным только в некоторых случаях.

Иногда массив обращается к памяти, находящейся вне диапазона, давая [[1.06540896337e-313, 0.0], [0.0, 3.0]]

Я подозреваю, что способ получения числа nonzeros неверен.

import Accelerate

func toString(_ A: SparseMatrix_Double) throws -> String  {
    if A.structure.rowCount > 100 || A.structure.columnCount > 100 {
        print("Matrix is too big to display")
        throw NSError(domain: "Matrix is too big to display", code: -1, userInfo: nil)
    }

    let rows = Int(A.structure.rowCount)
    let columns = Int(A.structure.columnCount)

    let nonzeros = A.structure.columnStarts[columns]

    print("Row indices")
    for i in 0..<nonzeros {
        print("\(i): \(A.structure.rowIndices[i])")
    }
    print("Column starts")
    for c in 0...columns {
        print("\(c): \(A.structure.columnStarts[c])")
    }

    var M = Array(repeating: Array(repeating: 0.0, count: columns), count: rows)

    var i = 0
    var currentColumn: Int = 0
    var nextColStarts = A.structure.columnStarts[1]
    while currentColumn < (columns - 1) {
        if i == nextColStarts {
            currentColumn += 1
            nextColStarts = A.structure.columnStarts[currentColumn + 1]
        }

        let rowIndex = Int(A.structure.rowIndices[i])
        M[rowIndex][currentColumn] = A.data[i]
        print("Setting \(rowIndex),\(currentColumn) [\(i)]")

        i += 1
    }

    return M.description
}

var rows: [Int32] = [1]
var columns: [Int32] = [1]
var values: [Double] = [3.0]

let blockSize: UInt8 = 1
let blockCount = 8

let A = SparseConvertFromCoordinate(
    2, 2,
    blockCount, blockSize,
    SparseAttributes_t(),
    &rows, &columns,
    &values
)

print(try? toString(A))
...