// bmatrix.cpp : Defines the exported functions for the DLL application. // Binary Matrix Class - CBVector // Copyright (c) 2015 Nonki Takahashi. The MIT License. // Version 0.4 /** * @author Nonki Takahashi * @version 0.4 */ #include "stdafx.h" #include "bvector.h" #include "bmatrix.h" #include <iostream> // This is the constructor of a class that has been exported. // see binarymath.h for the class definition /** * Constructor for CBMatrix class. * @param n number of rows of the matrix * @param m number of columns of the matrix * @since 0.1 */ CBMatrix::CBMatrix(int n, int m) { this->n = n; this->m = m; CBVector bv(n, "0"); for (int j = 0; j < m; j++) colv.push_back(bv); return; } /** * Copy operator for binary matrix * @param bm source bianary matrix * @since 0.2 */ void CBMatrix::operator=(CBMatrix &bm) { if (this == &bm) return; n = bm.n; m = bm.m; if (!bm.colv.empty()) { colv.clear(); for (int j = 0; j < m; j++) colv.push_back(bm.colv[j]); } return; } /** * Clear binary matrix * @since 0.1 */ void CBMatrix::clear(void) { for (int j = 0; j < m; j++) colv[j].clear(); return; } /** * Set value 0 or 1 to element i, j of binary matrix object * @param i element row number (1 origin) * @param j element column number (1 origin) * @param value value to set * @since 0.1 */ void CBMatrix::setValue(int i, int j, int value) { this->colv[j -1].setValue(i, value); return; } /** * Get value of element i, j in binary matrix object * @param i element row number (1 origin) * @param j element column number (1 origin) * @return got value * @since 0.1 */ int CBMatrix::getValue(int i, int j) { return colv[j -1].getValue(i); } /** * Count elements that values are 1 in binary matrix * @return number of 1 elements * @since 0.1 */ int CBMatrix::abs(void) { int n = 0; for (int j = 0; j < m; j++) n += colv[j].abs(); return n; } /** * Returns inverted binary matrix * @return inverted binary matrix * @since 0.1 */ CBMatrix CBMatrix::inv(void) { CBMatrix bm(n, m); for (int j = 0; j < m; j++) bm.colv[j] = colv[j].inv(); return bm; } /** * Returns true if two matrixes are equal. Returns false if error or different. * @param bm2 comparison target binary matrix * @return returns true if two matrixes are equal * @since 0.1 */ bool CBMatrix::equals(CBMatrix bm2) { if (n != bm2.n || m != bm2.m) { // different dimension return false; } for (int j = 0; j < m; j++) if (!colv[j].equals(bm2.colv[j])) { // different column value return false; } return true; } /** * Returns transposed binary vector * @return transposed binary vector * @since 0.1 */ CBVector CBMatrix::row(int i) { if (i < 1 || n < i) return 0; CBVector bv(m); for (int j = 0; j < m; j++) bv.setValue(j + 1, getValue(i, j + 1)); return bv; } /** * Returns transposed binary vector * @return transposed binary vector * @since 0.1 */ CBVector CBMatrix::tran1(void) { return row(1); } /** * Returns transposed binary matrix * @param binary matrix * @return transposed binary matrix * @since 0.1 */ CBMatrix CBMatrix::tran(void) { CBMatrix bm(m, n); for (int j = 0; j < m; j++) for (int i = 0; i < n; i++) bm.setValue(j + 1, i + 1, getValue(i + 1, j + 1)); return bm; } /** * Logical or with binary matrix object bm2 * @param bm2 second operand for logical or * @return logical or with bm2 (or 0 if error) * @since 0.1 */ CBMatrix CBMatrix::or(CBMatrix bm2) { if (n != bm2.n || m != bm2.m) return *this; // TODO return 0 CBMatrix bm(n, m); for (int j = 0; j < m; j++) bm.colv[j] = colv[j].or(bm2.colv[j]); return bm; } /** * Logical difference with binary matrix object bm2 * @param bm2 second operand for logical difference * @return logical difference with bm2 (or 0 if error) * @since 0.1 */ CBMatrix CBMatrix::diff(CBMatrix bm2) { if (n != bm2.n || m != bm2.m) return *this; // TODO return 0; CBMatrix bm(n, m); for (int j = 0; j < m; j++) bm.colv[j] = colv[j].diff(bm2.colv[j]); return bm; } /** * Logical and with binary matrix object bm2 * @param bm2 second operand for logical and * @return logical and with bm2 (or 0 if error) * @since 0.1 */ CBMatrix CBMatrix::and(CBMatrix bm2) { if (n != bm2.n || m != bm2.m) return *this; // TODO return 0; CBMatrix bm(n, m); for (int j = 0; j < m; j++) bm.colv[j] = colv[j].and(bm2.colv[j]); return bm; } /** * Logical xor with binary matrix object bm2 * @param bm2 second operand for logical xor * @return logical xor with bm2 (or 0 if error) * @since 0.1 */ CBMatrix CBMatrix::xor(CBMatrix bm2) { if (n != bm2.n || m != bm2.m) return *this; // TODO return 0; CBMatrix bm(n, m); for (int j = 0; j < m; j++) bm.colv[j] = colv[j].xor(bm2.colv[j]); return bm; } /** * Product with binary matrix object bm2 * @param bm2 second operand for product * @return product with bm2 (or 0 if error) * @since 0.1 */ CBMatrix CBMatrix::mul(CBMatrix bm2) { if (m != bm2.n) return *this; // TODO return 0; CBMatrix bm(n, bm2.m); for (int j = 0; j < bm2.m; j++) for (int i = 0; i < n; i++) bm.setValue(i + 1, j + 1, row(i + 1).dot(bm2.colv[j])); return bm; } /** * Product with binary vector object bv2 * @param bv2 second operand for product * @return product with bv2 (or 0 if error) * @since 0.1 */ CBVector CBMatrix::mul(CBVector bv2) { if (m != bv2.getOrder()) return 0; CBVector bv(m); for (int j = 0; j < m; j++) bv.setValue(j + 1, row(j + 1).dot(bv2)); return bv; } /** * Logical difference with binary matrix object bm2 * @param bm2 second operand for logical difference * @return logical difference with bm2 (or 0 if error) * @since 0.1 */ string CBMatrix::to_string(void) { string str(""); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { str += std::to_string(getValue(i, j)); if (j < m) str += " "; } str = str + "\n"; } return str; }