//Clase del 1 de septiembre
#include <iostream>
#include <algorithm>
#include <vector>
#include <assert.h>
using namespace std;
/////////////////////////////////////////////////////////////////////////////////////////////////////
/// CLASE
/////////////////////////////////////////////////////////////////////////////////////////////////////
class Matriz {
int rows, cols;
double *data;
public:
Matriz(int rows, int cols){
this->rows = rows;
this->cols = cols;
data = new double[rows * cols];
}
Matriz(const Matriz& m){
rows = m.nrows();
cols = m.ncols();
data = new double[rows * cols];
copy(m.data, m.data + (rows*cols), data);
}
~Matriz()
{
delete [] data;
}
double operator()(int row, int col) const {
assert(row >= 0 && col >= 0 && row < rows && col < cols);
return data[row*cols + col];
}
double& operator()(int row, int col) {
assert(row >= 0 && col >= 0 && row < rows && col < cols);
return data[row*cols + col];
}
int nrows() const
{
return rows;
}
int ncols() const
{
return cols;
}
};
/////////////////////////////////////////////////////////////////////////////////////////////////////
// OPERADORES
/////////////////////////////////////////////////////////////////////////////////////////////////////
ostream& operator<<(ostream &a, const Matriz& m){
for(int i = 0; i<m.nrows(); i++){
for(int j = 0; j<m.ncols(); j++){
a << m(i, j) << " ";
}
a << endl;
}
return a;
}
Matriz operator+(const Matriz &A, const Matriz &B){
assert(A.nrows() == B.nrows() && A.ncols() == B.ncols());
Matriz C(A.nrows(), A.ncols());
for(int i = 0; i<A.nrows(); i++)
{
for(int j = 0; j<A.ncols(); j++)
{
C(i, j) = A(i, j) + B(i, j);
}
}
return C;
}
Matriz operator-(const Matriz &A, const Matriz &B){
assert(A.nrows() == B.nrows() && A.ncols() == B.ncols());
Matriz C(A.nrows(), A.ncols());
for(int i = 0; i<A.nrows(); i++)
{
for(int j = 0; j<A.ncols(); j++)
{
C(i, j) = A(i, j) - B(i, j);
}
}
return C;
}
Matriz operator*(const Matriz &A, const Matriz&B){
assert(A.ncols() == B.nrows());
Matriz C(A.nrows(), B.ncols());
for(int i = 0; i<A.nrows(); i++)
{
for(int j = 0; j<B.ncols(); j++)
{
double ans = 0.0;
for(int k = 0; k<A.ncols(); k++)
{
ans += A(i, k)*B(k, j);
}
C(i, j) = ans;
}
}
return C;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
int main(){
Matriz A(2, 2);
A(0, 0) = 1.0;
A(0, 1) = -1.0;
A(1, 0) = -1.0;
Matriz B = A;
B(1, 1) = 2.0;
Matriz C = A * B;
cout << A << endl << B << endl << C << endl;
}
Ly9DbGFzZSBkZWwgMSBkZSBzZXB0aWVtYnJlCgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8gQ0xBU0UKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgpjbGFzcyBNYXRyaXogewoJaW50IHJvd3MsIGNvbHM7Cglkb3VibGUgKmRhdGE7CgoJcHVibGljOgoKCQlNYXRyaXooaW50IHJvd3MsIGludCBjb2xzKXsKCQkJdGhpcy0+cm93cyA9IHJvd3M7CgkJCXRoaXMtPmNvbHMgPSBjb2xzOwoJCQlkYXRhID0gbmV3IGRvdWJsZVtyb3dzICogY29sc107CgkJfQoKCQlNYXRyaXooY29uc3QgTWF0cml6JiBtKXsKCQkJcm93cyA9IG0ubnJvd3MoKTsKCQkJY29scyA9IG0ubmNvbHMoKTsKCQkJZGF0YSA9IG5ldyBkb3VibGVbcm93cyAqIGNvbHNdOwoJCQljb3B5KG0uZGF0YSwgbS5kYXRhICsgKHJvd3MqY29scyksIGRhdGEpOwoJCX0KCgkJfk1hdHJpeigpCgkJewoJCQlkZWxldGUgW10gZGF0YTsKCQl9CgoJCWRvdWJsZSBvcGVyYXRvcigpKGludCByb3csIGludCBjb2wpIGNvbnN0IHsKCQkJYXNzZXJ0KHJvdyA+PSAwICYmIGNvbCA+PSAwICYmIHJvdyA8IHJvd3MgJiYgY29sIDwgY29scyk7CgkJCXJldHVybiBkYXRhW3Jvdypjb2xzICsgY29sXTsKCQl9CgoJCWRvdWJsZSYgb3BlcmF0b3IoKShpbnQgcm93LCBpbnQgY29sKSB7CgkJCWFzc2VydChyb3cgPj0gMCAmJiBjb2wgPj0gMCAmJiByb3cgPCByb3dzICYmIGNvbCA8IGNvbHMpOwoJCQlyZXR1cm4gZGF0YVtyb3cqY29scyArIGNvbF07CgkJfQoKCQlpbnQgbnJvd3MoKSBjb25zdAoJCXsKCQkJcmV0dXJuIHJvd3M7CgkJfQoKCQlpbnQgbmNvbHMoKSBjb25zdAoJCXsKCQkJcmV0dXJuIGNvbHM7CgkJfQp9OwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gT1BFUkFET1JFUwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtICZhLCBjb25zdCBNYXRyaXomIG0pewoJZm9yKGludCBpID0gMDsgaTxtLm5yb3dzKCk7IGkrKyl7CgkJZm9yKGludCBqID0gMDsgajxtLm5jb2xzKCk7IGorKyl7CgkJCWEgPDwgbShpLCBqKSA8PCAiICI7CgkJfQoJCWEgPDwgZW5kbDsKCX0KCXJldHVybiBhOwp9CgpNYXRyaXogb3BlcmF0b3IrKGNvbnN0IE1hdHJpeiAmQSwgY29uc3QgTWF0cml6ICZCKXsKCWFzc2VydChBLm5yb3dzKCkgPT0gQi5ucm93cygpICYmIEEubmNvbHMoKSA9PSBCLm5jb2xzKCkpOwoKCU1hdHJpeiBDKEEubnJvd3MoKSwgQS5uY29scygpKTsKCWZvcihpbnQgaSA9IDA7IGk8QS5ucm93cygpOyBpKyspCgl7CgkJZm9yKGludCBqID0gMDsgajxBLm5jb2xzKCk7IGorKykKCQl7CgkJCUMoaSwgaikgPSBBKGksIGopICsgQihpLCBqKTsKCQl9Cgl9CglyZXR1cm4gQzsKfQoKTWF0cml6IG9wZXJhdG9yLShjb25zdCBNYXRyaXogJkEsIGNvbnN0IE1hdHJpeiAmQil7Cglhc3NlcnQoQS5ucm93cygpID09IEIubnJvd3MoKSAmJiBBLm5jb2xzKCkgPT0gQi5uY29scygpKTsKCglNYXRyaXogQyhBLm5yb3dzKCksIEEubmNvbHMoKSk7Cglmb3IoaW50IGkgPSAwOyBpPEEubnJvd3MoKTsgaSsrKQoJewoJCWZvcihpbnQgaiA9IDA7IGo8QS5uY29scygpOyBqKyspCgkJewoJCQlDKGksIGopID0gQShpLCBqKSAtIEIoaSwgaik7CgkJfQoJfQoJcmV0dXJuIEM7Cn0KCk1hdHJpeiBvcGVyYXRvciooY29uc3QgTWF0cml6ICZBLCBjb25zdCBNYXRyaXomQil7Cglhc3NlcnQoQS5uY29scygpID09IEIubnJvd3MoKSk7CglNYXRyaXogQyhBLm5yb3dzKCksIEIubmNvbHMoKSk7Cglmb3IoaW50IGkgPSAwOyBpPEEubnJvd3MoKTsgaSsrKQoJewoJCWZvcihpbnQgaiA9IDA7IGo8Qi5uY29scygpOyBqKyspCgkJewoJCQlkb3VibGUgYW5zID0gMC4wOwoJCQlmb3IoaW50IGsgPSAwOyBrPEEubmNvbHMoKTsgaysrKQoJCQl7CgkJCQlhbnMgKz0gQShpLCBrKSpCKGssIGopOwoJCQl9CgkJCUMoaSwgaikgPSBhbnM7CgkJfQoJfQoKCXJldHVybiBDOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKaW50IG1haW4oKXsKCU1hdHJpeiBBKDIsIDIpOwoJQSgwLCAwKSA9IDEuMDsKCUEoMCwgMSkgPSAtMS4wOwoJQSgxLCAwKSA9IC0xLjA7CgoJTWF0cml6IEIgPSBBOwoJQigxLCAxKSA9IDIuMDsKCglNYXRyaXogQyA9IEEgKiBCOwoKCWNvdXQgPDwgQSA8PCBlbmRsIDw8IEIgPDwgZW5kbCA8PCBDIDw8IGVuZGw7Cgp9