33 for (int32_t
i = 0;
i < mN;
i++) {
34 double* rowI = &mA[
i * mShift];
35 double* rowIb = &mA[
i * mShift + mN];
36 double c = (fabs(rowI[
i]) > 1.e-10) ? 1. / rowI[
i] : 0.;
37 double* rowJ = rowI + mShift;
38 for (int32_t
j =
i + 1;
j < mN;
j++, rowJ += mShift) {
40 double aij =
c * rowI[
j];
41 for (int32_t k =
j; k < mShift; k++) {
42 rowJ[k] -= aij * rowI[k];
47 for (int32_t k = 0; k < mM; k++) {
52 for (int32_t
i = mN - 1;
i >= 0;
i--) {
53 double* rowIb = &mA[
i * mShift + mN];
54 double* rowJb = rowIb - mShift;
55 for (int32_t
j =
i - 1;
j >= 0;
j--, rowJb -= mShift) {
56 double aji = mA[
j * mShift +
i];
58 for (int32_t k = 0; k < mM; k++) {
59 rowJb[k] -= aji * rowIb[k];
83 constexpr int32_t
n = 30;
84 constexpr int32_t d = 3;
88 std::uniform_real_distribution<> uniform(-.999, .999);
91 int32_t nTries = 10000;
93 auto tmpTime = std::chrono::high_resolution_clock::now();
94 auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(tmpTime - tmpTime);
95 auto durationMult = duration;
97 for (int32_t iter = 0; iter < nTries; iter++) {
102 for (int32_t
i = 0;
i <
n;
i++) {
103 for (int32_t
j = 0;
j < d;
j++) {
104 x[
i][
j] = 1. * uniform(
gen);
107 for (int32_t
i = 0;
i <
n;
i++) {
108 A[
i][
i] = fabs(2. + uniform(
gen));
110 for (int32_t
i = 0;
i <
n;
i++) {
111 for (int32_t
j =
i + 1;
j <
n;
j++) {
116 for (int32_t
i = 0;
i <
n;
i++) {
119 if (prn && iter == nTries - 1) {
120 for (int32_t
i = 0;
i <
n;
i++) {
122 for (int32_t
j = 0;
j <
n;
j++) {
123 LOG(info) << std::fixed << std::setw(5) << std::setprecision(2) <<
A[
i][
j] <<
" ";
130 auto startMult = std::chrono::high_resolution_clock::now();
131 for (int32_t
i = 0;
i <
n;
i++) {
132 for (int32_t k = 0; k < d; k++) {
135 for (int32_t
j = 0;
j <
n;
j++) {
136 for (int32_t k = 0; k < d; k++) {
141 auto stopMult = std::chrono::high_resolution_clock::now();
142 durationMult += std::chrono::duration_cast<std::chrono::nanoseconds>(stopMult - startMult);
146 for (int32_t
i = 0;
i <
n;
i++) {
147 for (int32_t k = 0; k < d; k++) {
148 sym.
B(
i, k) =
b[
i][k];
150 for (int32_t
j =
i;
j <
n;
j++) {
155 auto start = std::chrono::high_resolution_clock::now();
157 auto stop = std::chrono::high_resolution_clock::now();
158 duration += std::chrono::duration_cast<std::chrono::nanoseconds>(stop -
start);
161 for (int32_t
i = 0;
i <
n;
i++) {
162 for (int32_t k = 0; k < d; k++) {
163 double t = fabs(
x[
i][k] - sym.
B(
i, k));
169 if (maxDiff < diff) {
176 int32_t ok = (maxDiff < 1.e-7);
179 LOG(info) << std::defaultfloat;
180 LOG(info) <<
"\n\n Overall max diff " << maxDiff <<
"\n";
181 LOG(info) <<
" time " << duration.count() / nTries;
182 LOG(info) <<
" time multiplication " << durationMult.count() / nTries;