Проблемы cblas_dgemm в Swift с использованием Accelerate Framework

Я хотел умножить две матрицы в Swift. Я нашел отличный ответ в этой теме: умножение матриц в быстром использовании Accelerate framework 32 бит против 64 бит, в котором мне сказали использовать cblas_dgemm для умножения двух матриц. Вот мой код:

import SpriteKit
import Accelerate


class GetMatrix {
var cols:Int, rows:Int
var matrix:[Double]


init(cols:Int, rows:Int) {
    self.cols = cols
    self.rows = rows
    matrix = Array(count:cols*rows, repeatedValue:0.0)
}

subscript(col:Int, row:Int) -> Double {
    get {
        return matrix[cols * row + col]
    }
    set {
        matrix[cols*row+col] = newValue
    }
}

func colCount() -> Int {
    return self.cols
}

func rowCount() -> Int {
    return self.rows
}
}
class GameScene: SKScene {


var firstMatrix = GetMatrix(cols: 18, rows: 18)
var secondMatrix = GetMatrix(cols: 18, rows: 18)
var answerMatrix = GetMatrix(cols: 18, rows: 18)


override func didMoveToView(view: SKView) {

    for c in 0...17 {
        for r in 0...17 {
            firstMatrix[r,c] = 2.0
        }
    }
    for c in 0...17 {
        for r in 0...17 {
            secondMatrix[r,c] = 1.0
        }
    }
    for c in 0...17 {
        for r in 0...17 {
            answerMatrix[r,c] = 0.0
        }
    }


    cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 18, 18, 18, 1.0, firstMatrix, 18, secondMatrix, 18, 0.0, answerMatrix, 18) // Error in this line



}


}

Код не строится. В строке с cblas_dgemm есть проблема. Пишет, что «GetMatrix» нельзя преобразовать в «UnsafePointer». Пожалуйста, помогите, как мне решить эту проблему?


person Dman    schedule 01.11.2014    source источник


Ответы (1)


var firstMatrix = GetMatrix(cols: 18, rows: 18)
var secondMatrix = GetMatrix(cols: 18, rows: 18)
var answerMatrix = GetMatrix(cols: 18, rows: 18)
.
.
.
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 18, 18, 18, 1.0, firstMatrix, 18, secondMatrix, 18, 0.0, answerMatrix, 18) 

Ваш код передает класс GetMatrix в cblas_dgemm. Вам нужно будет передать ссылку на фактическую матрицу. Что-то типа

cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 18, 18, 18, 1.0, &firstMatrix.matrix, 18, &secondMatrix.matrix, 18, 0.0, &answerMatrix.matrix, 18) 

(при условии, что остальные параметры верны)

person MirekE    schedule 01.11.2014
comment
Работал отлично! Спасибо - person Dman; 01.11.2014