#include <iostream>
#include <cassert>
using namespace std;
void zero(int* v, int r, int s)
{
int cnt = r * s;
for (int i = 0; i < cnt; i++)
v[i] = 0;
}
void one(int* v, int r, int s)
{
zero(v, r, s);
assert (r == s);
for (int i = 0; i < r; i++)
v[i * s + i] = 1;
}
void print (int* v, int r, int s)
{
for (int i = 0; i < r; i++)
{
cout << "(";
for (int k = 0; k < s; k++)
{
cout << v[i * s + k];
if (k < s - 1) cout << ", ";
}
cout << ")" << endl;
}
cout << endl;
}
void add (int* v, int* x, int* y, int r, int s)
{
/*
for (int i = 0; i < r; i++)
for (int k = 0; k < s; k++)
{
// v[i,k] = x[i,k] + y[i,k];
v[i*s+k] = x[i*s+k] + y[i*s+k];
}
*/
int cnt = r * s;
for (int i = 0; i < cnt; i++)
v[i] = x[i] + y[i];
}
void mul(int* v, int* x, int* y, int r, int s, int t)
// v = x * y
// x .. r * s
// y .. s * t
// v .. r * t
{
for (int i = 0; i < r; i++) // i ... radek z matice x
for (int j = 0; j < t; j++) // j ... sloupec z matice y
{
// v[i,j] ... v[i*t+j]
int sum = 0;
for (int k = 0; k < s; k++)
{
// sum = sum + x[i,k] * y [k,j]
sum = sum + x[i * s + k] * y[k * t + j];
}
v[i * t + j] = sum;
}
}
void step(int* v, int r, int s, int i, int j)
{
v[i * s + j] = 1;
v[j * s + i] = 1;
}
int main()
{
int r = 3;
int s = r;
int* a = new int[r * s];
int* b = new int[r * s];
int* c = new int[r * s];
one (a, r, s);
one (b, r, s);
// step(a, r, s, 0, 1);
// step(a, r, s, 1, 2);
mul(c, a, b, r, r, r); // c = a * b
// NELZE mul (a, a, b, r, r, r); // a = a * b
print(a, r, s);
print(c, r, s);
}
#include <iostream>
#include <cassert>
using namespace std;
const int r = 10;
const int s = 10;
typedef double M [r][s];
void zero(M v)
{
for (int i = 0; i < r; i++)
for (int k = 0; k < s; k++)
v[i][k] = 0;
}
void one (M v)
{
zero(v);
assert (r == s);
for (int i = 0; i < r; i++)
v[i][i] = 1;
}
void print (M v)
{
for (int i = 0; i < r; i++)
{
cout << "(";
for (int k = 0; k < s; k++)
{
cout << v[i][k];
if (k < s - 1) cout << ", ";
}
cout << ")" << endl;
}
cout << endl;
}
void add (M v, M x, M y)
{
for (int i = 0; i < r; i++)
for (int k = 0; k < s; k++)
{
v[i][k] = x[i][k] + y[i][k];
}
}
void mul(M v, M x, M y)
{
assert (r == s);
for (int i = 0; i < r; i++) // i ... radek z matice x
for (int j = 0; j < r; j++) // j ... sloupec z matice y
{
int sum = 0;
for (int k = 0; k < r; k++)
{
sum = sum + x[i][k] * y[k][j];
}
v[i][j] = sum;
}
}
int main()
{
M a;
M b;
M c;
one (a);
one (b);
add (a, a, b);
mul (c, a, a); // c = a * b
// NELZE mul (a, a, b); // a = a * b
print (a);
print (c);
}
#include <iostream>
#include <cassert>
using namespace std;
const int r = 10;
const int s = 10;
struct M
{
double data [r][s];
};
// void zero(double v [r][s])
void zero(M & v)
{
for (int i = 0; i < r; i++)
for (int k = 0; k < s; k++)
v.data[i][k] = 0;
}
void one (M & v)
{
zero(v);
assert (r == s);
for (int i = 0; i < r; i++)
v.data[i][i] = 1;
}
void print (M & v)
{
for (int i = 0; i < r; i++)
{
cout << "(";
for (int k = 0; k < s; k++)
{
cout << v.data[i][k];
if (k < s - 1) cout << ", ";
}
cout << ")" << endl;
}
cout << endl;
}
void add (M & v, M x, M y)
{
for (int i = 0; i < r; i++)
for (int k = 0; k < s; k++)
{
v.data[i][k] = x.data[i][k] + y.data[i][k];
}
}
void mul(M & v, M x, M y)
{
assert (r == s);
for (int i = 0; i < r; i++) // i ... radek z matice x
for (int j = 0; j < r; j++) // j ... sloupec z matice y
{
int sum = 0;
for (int k = 0; k < r; k++)
{
sum = sum + x.data[i][k] * y.data[k][j];
}
v.data[i][j] = sum;
}
}
int main()
{
M a;
M b;
M c;
one (a);
one (b);
add (a, a, b);
mul (c, a, a); // c = a * b
// O.K. mul (a, a, b); // a = a * b
print (a);
print (c);
}
#include <iostream>
#include <cassert>
using namespace std;
const int r = 10;
const int s = 10;
struct M
{
double data [r][s];
};
// void zero(double v [r][s])
M zero()
{
M v;
for (int i = 0; i < r; i++)
for (int k = 0; k < s; k++)
v.data[i][k] = 0;
return v;
}
M one ()
{
M v = zero ();
assert (r == s);
for (int i = 0; i < r; i++)
v.data[i][i] = 1;
return v;
}
void print (M & v)
{
for (int i = 0; i < r; i++)
{
cout << "(";
for (int k = 0; k < s; k++)
{
cout << v.data[i][k];
if (k < s - 1) cout << ", ";
}
cout << ")" << endl;
}
cout << endl;
}
M add (M x, M y)
{
M v;
for (int i = 0; i < r; i++)
for (int k = 0; k < s; k++)
{
v.data[i][k] = x.data[i][k] + y.data[i][k];
}
return v;
}
M mul (M x, M y)
{
M v;
assert (r == s);
for (int i = 0; i < r; i++) // i ... radek z matice x
for (int j = 0; j < r; j++) // j ... sloupec z matice y
{
int sum = 0;
for (int k = 0; k < r; k++)
{
sum = sum + x.data[i][k] * y.data[k][j];
}
v.data[i][j] = sum;
}
return v;
}
int main()
{
M a;
M b;
M c;
a = one ();
b = one ();
a = add (a, b);
c = mul (a, a); // c = a * a
print (a);
print (c);
}