#include #include 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 #include 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 #include 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 #include 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); }