Matrix Multiplication
package algorithmdesignmanualbook.datastructures
import utils.PrintUtils
import kotlin.test.assertFails
typealias  Matrix = Array<Array<Int>>
typealias  Dimen = Pair<Int, Int>
fun main() {
    val matA = arrayOf(arrayOf(1, 2, 3), arrayOf(3, 3, 3), arrayOf(5, 4, 3))
    val matB = arrayOf(arrayOf(1, 3), arrayOf(2, 3), arrayOf(3, 3))
    multiplyMatrix(matA, matB)
    val matA2 = arrayOf(arrayOf(1, 2, 3), arrayOf(3, 3, 3))
    val matB2 = arrayOf(arrayOf(1, 3), arrayOf(3, 3))
    assertFails { multiplyMatrix(matA2, matB2) }
}
/**
 * Complexity of this algorithm = O(xyz) i.e. CUBIC
 */
fun multiplyMatrix(matA: Matrix, matB: Matrix): Matrix {
    PrintUtils.printArr(matA.toList())
    println("x")
    PrintUtils.printArr(matB.toList())
    require(matA[0].size == matB.size) {
        "Matrix multiplication not possible between ${matA.dimension().str()} & ${matB.dimension().str()}"
    }
    val result = Array(matA[0].size) {
        Array(matB[0].size) { 0 }
    }
    for (i in 0..matA[0].lastIndex) {
        for (j in 0..matB[0].lastIndex) {
            result[i][j] = 0
            for (k in 0..matA.lastIndex) {
                result[i][j] += matA[i][k] * matB[k][j]
            }
        }
    }
    return result.also {
        PrintUtils.printArr(result.toList())
        println()
    }
}
private fun Matrix.dimension(): Dimen = Pair(this.size, this[0].size)
private fun Dimen.str(): String = "${first}x${second} "
Updated on 2021-02-08