On Monday, 17 February 2020 at 13:44:55 UTC, Adnan wrote:
https://ideone.com/lVi5Uy

module strassens_matmul;

debug {
    static import std;
}
...

Okay I changed to
module strassens_matmul;

debug {
    static import std;
}

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

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

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

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

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

T[][] mulIterative(T)(scope const ref T[][] mat1, scope const T[][] mat2) { auto result = createMatrix!T(getRowSize!T(mat1), getColumnSize!T(mat2));
        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);
}

///

cdsa ~master: building configuration "cdsa-test-library"...
source/strassens_matmul.d(22,16): Error: cannot implicitly convert expression &mat[row][column] of type const(uint)* to uint* source/strassens_matmul.d(37,36): Error: template instance strassens_matmul.getPointPtr!uint error instantiating
source/strassens_matmul.d(48,29):


Reply via email to