             
             var element:T = left[row, 0] * right[0][column]
             
-            for i in 1 ..< v {
+            for i in 1 ..< left.dimensions.columns {
                 
                 element = element + left[row, i] * right[i, column]
             }

    return mcombine(left, right){ $0 + $1 }
}

func + (left: Matrix<Float>, right: Matrix<Float>) -> Matrix<Float> {
    
    if left.dimensions != right.dimensions {

//    
//    return Matrix(elementsList: elementsList, dimensions: left.dimensions)
    
    var elementsList = right.elementsList
    
    cblas_saxpy(Int32(left.dimensions.product), 1.0, left.elementsList, 1, &elementsList, 1)
    
    return Matrix(elementsList: elementsList, dimensions: left.dimensions)
    
//    var elementsList = right.elementsList
//    
//    catlas_saxpby(Int32(left.dimensions.product), 1.0, left.elementsList, 1, 1.0, &elementsList, 1)
//    
//    return Matrix(elementsList: elementsList, dimensions: left.dimensions)
}

/**
    Returns the sum of the two matrices.

    :param: left    The left matrix in the sum.
    :param: right   The right matrix in the sum.

    :returns: A matrix of the same dimensions as the two
    given matrices.

    :exception: Throws an exception when the dimensions of the two matrices are not equal.
*/
func + (left: Matrix<Double>, right: Matrix<Double>) -> Matrix<Double> {
    
    if left.dimensions != right.dimensions {
        NSException(name: "Unequal dimensions", reason: "The dimensions of the two matrices are not equal.", userInfo: nil).raise()
    }
    
    //    var elementsList = [Float](count: left.dimensions.product, repeatedValue: 0)
    //
    //    vDSP_vaddD(left.elementsList, 1, right.elementsList, 1, &elementsList, 1, vDSP_Length(left.dimensions.product))
    //
    //    return Matrix(elementsList: elementsList, dimensions: left.dimensions)
    
    var elementsList = right.elementsList
    
    cblas_daxpy(Int32(left.dimensions.product), 1.0, left.elementsList, 1, &elementsList, 1)
    
    return Matrix(elementsList: elementsList, dimensions: left.dimensions)
    
    //    var elementsList = right.elementsList
    //
    //    catlas_daxpby(Int32(left.dimensions.product), 1.0, left.elementsList, 1, 1.0, &elementsList, 1)
    //
    //    return Matrix(elementsList: elementsList, dimensions: left.dimensions)
}


// MARK: Matrix Negation

/**
    Returns the negation of the given matrix.

    :param: matrix  The matrix to negate.

    :returns: A matrix with the given dimensions as the given matrix
                where every element is the negation of the corresponding
                element in the given matrix.
*/
prefix func - <T: MatrixCompatible> (matrix: Matrix<T>) -> Matrix<T> {
    
    return mmap(matrix){ -$0 }
