====== Matice ======
#include
#include "lexer.h"
class Matice
{
public:
typedef double T;
int R;
int S;
T * data;
Matice () : R (0), S (0), data (nullptr) { }
Matice (int R0, int S0) : R (0), S (0), data (nullptr) { alloc (R0, S0); }
~Matice () { if (data != nullptr) delete[] data; }
void alloc (int R0, int S0);
T& operator ( ) (int i, int k);
};
void Matice::alloc (int R0, int S0)
{
if (data != nullptr) delete[] data;
R = R0;
S = S0;
data = new T [R*S];
}
inline Matice::T & Matice::operator ( ) (int i, int k)
{
// if (i < 0 || i >= R || k < 0 || k >= S) throw runtime_error ("Bad index");
return data [i*R+k];
}
int main()
{
Matice m (10, 10);
try
{
m (1,2) = 10;
cout << m (1, 2) << endl;
}
catch (runtime_error err)
{
cout << "Neco se nepovedlo: " << err.what () << endl;
}
cout << "O.K.";
return 0;
}
====== Matice využívající jednorozměrná pole ======
#include
#include
using namespace std;
class Mat
{
public:
double* operator [] (int i) // i-ty radek
{
assert (i >= 0 && i < m);
return & p [i * n];
}
int M() { return m; }
int N() { return n; }
void print()
{
cout << "{" << endl;
for (int i = 0; i < m; i++)
{
cout << " [";
for (int j = 0; j < n; j++)
{
cout << p[i * n + j];
if (j < n - 1) cout << ", ";
}
cout << " ]" << endl;
}
cout << "}" << endl;
}
Mat (int m0, int n0) // m radek, n sloupcu
{
m = m0;
n = n0;
p = new double[m * n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
(*this)[i][j] = i + j;
// p[i*n+j] = i + j;
}
~Mat()
{
delete p;
p = nullptr;
m = 0;
n = 0;
}
private:
int m, n; // m radek, n sloupcu
double * p;
};
void add (Mat & z, Mat & x, Mat & y)
{
int m = z.M();
int n = z.N();
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
z[i][j] = x[i][j] + y[i][j];
}
int main()
{
int M = 10;
int N = 20;
Mat a (M, N);
Mat b (M, N);
Mat c (M, N);
for (int i = 0; i < M; i++)
for (int j = 0; j < N; j++)
{
a[i][j] = i + j;
b[i][j] = 2*(i + j);
}
add (c, a, b); // c = a + b
a.print();
b.print();
c.print();
cout << "O.K.\n";
}
====== Násobení matic ======
#include
#include
using namespace std;
class Mat
{
public:
double* operator [] (int i) // i-ty radek
{
assert (i >= 0 && i < m);
return & p [i * n];
}
int M() { return m; }
int N() { return n; }
void print()
{
cout << "{" << endl;
for (int i = 0; i < m; i++)
{
cout << " [";
for (int j = 0; j < n; j++)
{
cout << p[i * n + j];
if (j < n - 1) cout << ", ";
}
cout << " ]" << endl;
}
cout << "}" << endl;
}
Mat (int m0, int n0) // m radek, n sloupcu
{
m = m0;
n = n0;
p = new double[m * n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
(*this)[i][j] = i + j;
// p[i*n+j] = i + j;
}
~Mat()
{
delete p;
p = nullptr;
m = 0;
n = 0;
}
private:
int m, n; // m radek, n sloupcu
double * p;
};
void add(Mat& z, Mat& x, Mat& y) // z := x + y
{
int m = z.M();
int n = z.N();
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
z[i][j] = x[i][j] + y[i][j];
}
void mul (Mat& z, Mat& x, Mat& y) // z := x * y
{
int m = x.M();
int n = y.N();
int t = x.N();
assert(t == y.M());
assert(m == z.M());
assert(n == z.N());
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
double sum = 0;
for (int k = 0; k < t; k++)
sum = sum + x[i][k] * y[k][j];
z[i][j] = sum;
}
}
int main()
{
Mat a (2, 2);
Mat b (2, 1);
Mat c (2, 1);
a[0][0] = 2;
a[0][1] = 0;
a[1][0] = 0;
a[1][1] = 1;
b[0][0] = 7;
b[1][0] = 8;
mul(c, a, b);
a.print();
b.print();
c.print();
cout << "O.K.\n";
}