https://ideone.com/lVi5Uy

module strassens_matmul;

debug {
    static import std;
}

package {
    ulong getRowSize(T)(T[][] mat) {
        return mat[0].length;
    }

    ulong getColumnSize(T)(T[][] mat) {
        return mat.length;
    }

T[][] createMatrix(T)(const ulong rowSize, const ulong columnSize) {
        return new T[][](rowSize, columnSize);
    }

    /// row and column are 0 index-based
T* getPointPtr(T)(T[][] mat, const ulong row, const ulong column) {
        return &mat[row][column];
    }

T getPointCopy(T)(T[][] mat, const ulong row, const ulong column) {
        return mat[row][column];
    }

T[][] mulIterative(T)(scope const T[][] mat1, scope const T[][] mat2) { auto result = createMatrix!T(mat1.getRowSize, mat2.getColumnSize);
        foreach (row; 0 .. mat1.getRowSize()) {
            foreach (column; 0 .. mat2.getColumnSize()) {
                T value;
                foreach (i; 0 .. mat1.getRowSize()) {
value += mat1.getPointCopy(row, i) * mat2.getPointCopy(i, column);
                }
                *result.getPointPtr(row, column) = value;
            }
        }
        return result;
    }
}

unittest {
    const uint[][] matA = [[10, 20, 10], [4, 5, 6], [2, 3, 5]];
    const uint[][] matB = [[3, 2, 4], [3, 3, 9], [4, 4, 2]];
const uint[][] matC = [[130, 120, 240], [51, 47, 73], [35, 33, 45]];
    assert(matA.mulIterative(matB) == matC);
}

///

source/strassens_matmul.d(30,42): Error: template strassens_matmul.getRowSize cannot deduce function from argument types !()(const(uint[][])), candidates are:
source/strassens_matmul.d(8,11):        getRowSize(T)(T[][] mat)
source/strassens_matmul.d(30,59): Error: template strassens_matmul.getColumnSize cannot deduce function from argument types !()(const(uint[][])), candidates are: source/strassens_matmul.d(12,11): getColumnSize(T)(T[][] mat) source/strassens_matmul.d(31,43): Error: template strassens_matmul.getRowSize cannot deduce function from argument types !()(const(uint[][])), candidates are:
source/strassens_matmul.d(8,11):        getRowSize(T)(T[][] mat)
source/strassens_matmul.d(48,29): Error: template instance strassens_matmul.mulIterative!uint error instantiating
dmd failed with exit code 1.

Reply via email to