/// <summary> /// Multiplies matrix by IntegerBitsetMatrix /// </summary> public void MultiplyByMatrix(IntegerBitsetMatrix multiplierMatrix) { if (multiplierMatrix == null) { throw new ArgumentNullException(nameof(multiplierMatrix)); } var aRows = _rows; var aCols = _columns; var bRows = multiplierMatrix.GetRows(); var bCols = multiplierMatrix.GetColumns(); if (aCols != bRows) { throw new OperationCanceledException("Non-conformable matrices in MultiplyByMatrix"); } var result = new IntegerBitsetMatrix(aRows, bCols); for (var i = 0; i < aCols; ++i) // each row of A { for (var j = 0; j < bRows; ++j) // each col of B { for (var k = 0; k < aRows; ++k) { //Bit by Bit Multiplying result.Matrix[i][j] = new IntegerBitset( IntegerBitsetUtils.BitArrayAdder( Matrix[i][j].GetBitArray(), IntegerBitsetUtils.BitArrayTruncate( IntegerBitsetUtils.BitArrayMultiply( Matrix[i][k].GetBitArray(), multiplierMatrix.Matrix[k][j].GetBitArray(), new BitArray(1, false), out _), 32), new BitArray(1, false), out _)); } } } Matrix = result.Matrix; _columns = result.GetColumns(); _rows = result.GetRows(); }
/// <summary> /// Adds IntegerBitsetMatrix to this /// </summary> public void AddMatrix(IntegerBitsetMatrix additionMatrix) { if (additionMatrix == null) { throw new ArgumentNullException(nameof(additionMatrix)); } if (_rows != additionMatrix.GetRows() || _columns != additionMatrix.GetColumns()) { throw new OperationCanceledException("Sizes of matrix are different"); } for (var i = 0; i < _columns; i++) { for (var j = 0; j < _rows; j++) { Matrix[i][j] = new IntegerBitset(IntegerBitsetUtils.BitArrayAdder(Matrix[i][j].GetBitArray(), additionMatrix.Matrix[i][j].GetBitArray(), new BitArray(1, false), out _)); } } }