/firmware/Back_IMU/HARDWARE/IIC/ekf_math.c

https://github.com/golaced/Oldx_fly_controller · C · 833 lines · 743 code · 69 blank · 21 comment · 145 complexity · acb22e650f9e69255698543d788daa29 MD5 · raw file

  1. #include "ekf_math.h"
  2. // ËÄÔªÊýת»¯³ÉÒ»¸ö½«ÏòÁ¿ÓÉNED×ø±êϵÐýתµ½»úÌå×ø±êϵµÄ¾ØÕó
  3. void Quaternion2Tnb(const float q[4], float Tnb[3][3])
  4. {
  5. // Calculate the ned to body cosine matrix
  6. float q00 = q[0] * q[0];
  7. float q11 = q[1] * q[1];
  8. float q22 = q[2] * q[2];
  9. float q33 = q[3] * q[3];
  10. float q01 = q[0] * q[1];
  11. float q02 = q[0] * q[2];
  12. float q03 = q[0] * q[3];
  13. float q12 = q[1] * q[2];
  14. float q13 = q[1] * q[3];
  15. float q23 = q[2] * q[3];
  16. Tnb[0][0] = q00 + q11 - q22 - q33;
  17. Tnb[1][1] = q00 - q11 + q22 - q33;
  18. Tnb[2][2] = q00 - q11 - q22 + q33;
  19. Tnb[0][1] = 2 * (q12 + q03);
  20. Tnb[0][2] = 2 * (q13 - q02);
  21. Tnb[1][0] = 2 * (q12 - q03);
  22. Tnb[1][2] = 2 * (q23 + q01);
  23. Tnb[2][0] = 2 * (q13 + q02);
  24. Tnb[2][1] = 2 * (q23 - q01);
  25. }
  26. //ËÄÔªÊýת»¯³ÉÒ»¸ö½«ÏòÁ¿ÓÉ»úÌå×ø±êϵÐýתµ½NED×ø±êϵµÄ¾ØÕó
  27. void Quaternion2Tbn(const float q[4], float Tbn[3][3])
  28. {
  29. // Calculate the body to ned cosine matrix
  30. float q00 = q[0] * q[0];
  31. float q11 = q[1] * q[1];
  32. float q22 = q[2] * q[2];
  33. float q33 = q[3] * q[3];
  34. float q01 = q[0] * q[1];
  35. float q02 = q[0] * q[2];
  36. float q03 = q[0] * q[3];
  37. float q12 = q[1] * q[2];
  38. float q13 = q[1] * q[3];
  39. float q23 = q[2] * q[3];
  40. Tbn[0][0] = q00 + q11 - q22 - q33;
  41. Tbn[1][1] = q00 - q11 + q22 - q33;
  42. Tbn[2][2] = q00 - q11 - q22 + q33;
  43. Tbn[0][1] = 2 * (q12 - q03);
  44. Tbn[0][2] = 2 * (q13 + q02);
  45. Tbn[1][0] = 2 * (q12 + q03);
  46. Tbn[1][2] = 2 * (q23 - q01);
  47. Tbn[2][0] = 2 * (q13 - q02);
  48. Tbn[2][1] = 2 * (q23 + q01);
  49. }
  50. // ÓÉËÄÔªÊýת³ÉÅ·À­½Ç
  51. void Quaternion2Euler(const float q[4], float euler[3])
  52. {
  53. float R13, R11, R12, R23, R33;
  54. float q0s = q[0] * q[0];
  55. float q1s = q[1] * q[1];
  56. float q2s = q[2] * q[2];
  57. float q3s = q[3] * q[3];
  58. R13 = 2.0f * (q[1] * q[3] - q[0] * q[2]);
  59. R11 = q0s + q1s - q2s - q3s;
  60. R12 = 2.0f * (q[1] * q[2] + q[0] * q[3]);
  61. R23 = 2.0f * (q[2] * q[3] + q[0] * q[1]);
  62. R33 = q0s - q1s - q2s + q3s;
  63. euler[0] = RAD_DEG * atan2f(R23, R33);
  64. euler[1] = RAD_DEG * asinf(-R13); // pitch always between -pi/2 to pi/2
  65. euler[2] = RAD_DEG * atan2f(R12, R11);
  66. }
  67. // ÓÉÅ·À­½Çת³ÉËÄÔªÊý
  68. void Euler2Quaternion(const float euler[3], float q[4])
  69. {
  70. float u1 = cos(0.5f * euler[0] * DEG_RAD);
  71. float u2 = cos(0.5f * euler[1] * DEG_RAD);
  72. float u3 = cos(0.5f * euler[2] * DEG_RAD);
  73. float u4 = sin(0.5f * euler[0] * DEG_RAD);
  74. float u5 = sin(0.5f * euler[1] * DEG_RAD);
  75. float u6 = sin(0.5f * euler[2] * DEG_RAD);
  76. q[0] = u1 * u2 * u3 + u4 * u5 * u6;
  77. q[1] = u4 * u2 * u3 - u1 * u5 * u6;
  78. q[2] = u1 * u5 * u3 + u4 * u2 * u6;
  79. q[3] = u1 * u2 * u6 - u4 * u5 * u3;
  80. }
  81. // ½«Ò»¸öÏòÁ¿ÓÉA×ø±êϵÐýתÖÁB×ø±êϵ
  82. void A_Fixed2B_Fixed(float TAB[3][3], float V[3])
  83. {
  84. float Vtmp[3];
  85. Vtmp[0] = V[0];
  86. Vtmp[1] = V[1];
  87. Vtmp[2] = V[2];
  88. V[0] = TAB[0][0] * Vtmp[0] + TAB[0][1] * Vtmp[1] + TAB[0][2] * Vtmp[2];
  89. V[1] = TAB[1][0] * Vtmp[0] + TAB[1][1] * Vtmp[1] + TAB[1][2] * Vtmp[2];
  90. V[2] = TAB[2][0] * Vtmp[0] + TAB[2][1] * Vtmp[1] + TAB[2][2] * Vtmp[2];
  91. }
  92. // ÓÉËÄÔªÊý½«»úÌå²Î¿¼ÏµµÄÏòÁ¿ÐýתÖÁNED×ø±êϵÏÂ
  93. void Quaternion2NED(const float q[4], float V_NED[3])
  94. {
  95. float Tbn[3][3];
  96. Quaternion2Tbn(q, Tbn);
  97. A_Fixed2B_Fixed(Tbn, V_NED);
  98. }
  99. //??NED???
  100. void Cal_Vel_NED(double velNED[3], double gpsCourse, double gpsGndSpd, double gpsVelD)
  101. {
  102. velNED[0] = gpsGndSpd*cos(gpsCourse * DEG_RAD);
  103. velNED[1] = gpsGndSpd*sin(gpsCourse * DEG_RAD);
  104. velNED[2] = gpsVelD;
  105. }
  106. // ²ÎÊý˵Ã÷: posNEDr[3] ´æ·Åת»»ºóµÄNEDλÖÃ×ø±ê
  107. // latÎÀÐǶ¨Î»µÄγ¶È*µ¥Î»ÊÇrad/s* lonÎÀÐǶ¨Î»µÄ¾­¶È*µ¥Î»ÊÇrad/s* hgtÎÀÐǶ¨Î»µÄ¸ß¶È*µ¥Î»ÊÇm*
  108. // latReference ²Î¿¼µÄγ¶È(±ÈÈç¿ÉÒÔÊÇ·É»úÆð·ÉµÄÄǸöγ¶È)*µ¥Î»ÊÇrad/s*
  109. // lonReference ²Î¿¼µÄ¾­¶È(±ÈÈç¿ÉÒÔÊÇ·É»úÆð·ÉµÄÄǸö¾­¶È)*µ¥Î»ÊÇrad/s*
  110. // hgtReference ²Î¿¼¸ß¶È(±ÈÈç¿ÉÒÔÊÇ·É»úÆð·ÉµÄº£°Î¸ß¶È)*µ¥Î»ÊÇm*
  111. void Cal_Pos_NED(double posNEDr[3], double lat, double lon, float hgt, double latReference, double lonReference, float hgtReference)
  112. {
  113. posNEDr[0] = earthRadius * (lat - latReference);
  114. posNEDr[1] = earthRadius * cos(latReference) * (lon - lonReference);
  115. posNEDr[2] = -(hgt - hgtReference);
  116. }
  117. // 3*3 y = x^-1
  118. void Matrix_3X3_Inv(const real_T a[9], real_T c[9])
  119. {
  120. real_T x[9];
  121. int32_T p1;
  122. int32_T p2;
  123. int32_T p3;
  124. real_T absx11;
  125. real_T absx21;
  126. real_T absx31;
  127. int32_T itmp;
  128. memcpy(&x[0], &a[0], 9U * sizeof(real_T));
  129. p1 = 0;
  130. p2 = 3;
  131. p3 = 6;
  132. absx11 = fabs(a[0]);
  133. absx21 = fabs(a[1]);
  134. absx31 = fabs(a[2]);
  135. if ((absx21 > absx11) && (absx21 > absx31)) {
  136. p1 = 3;
  137. p2 = 0;
  138. x[0] = a[1];
  139. x[1] = a[0];
  140. absx11 = x[3];
  141. x[3] = x[4];
  142. x[4] = absx11;
  143. absx11 = x[6];
  144. x[6] = x[7];
  145. x[7] = absx11;
  146. } else {
  147. if (absx31 > absx11) {
  148. p1 = 6;
  149. p3 = 0;
  150. x[0] = a[2];
  151. x[2] = a[0];
  152. absx11 = x[3];
  153. x[3] = x[5];
  154. x[5] = absx11;
  155. absx11 = x[6];
  156. x[6] = x[8];
  157. x[8] = absx11;
  158. }
  159. }
  160. x[1] /= x[0];
  161. x[2] /= x[0];
  162. x[4] -= x[1] * x[3];
  163. x[5] -= x[2] * x[3];
  164. x[7] -= x[1] * x[6];
  165. x[8] -= x[2] * x[6];
  166. if (fabs(x[5]) > fabs(x[4])) {
  167. itmp = p2;
  168. p2 = p3;
  169. p3 = itmp;
  170. absx11 = x[1];
  171. x[1] = x[2];
  172. x[2] = absx11;
  173. absx11 = x[4];
  174. x[4] = x[5];
  175. x[5] = absx11;
  176. absx11 = x[7];
  177. x[7] = x[8];
  178. x[8] = absx11;
  179. }
  180. x[5] /= x[4];
  181. x[8] -= x[5] * x[7];
  182. absx11 = (x[5] * x[1] - x[2]) / x[8];
  183. absx21 = -(x[1] + x[7] * absx11) / x[4];
  184. c[p1] = ((1.0f - x[3] * absx21) - x[6] * absx11) / x[0];
  185. c[p1 + 1] = absx21;
  186. c[p1 + 2] = absx11;
  187. absx11 = -x[5] / x[8];
  188. absx21 = (1.0f - x[7] * absx11) / x[4];
  189. c[p2] = -(x[3] * absx21 + x[6] * absx11) / x[0];
  190. c[p2 + 1] = absx21;
  191. c[p2 + 2] = absx11;
  192. absx11 = 1.0f / x[8];
  193. absx21 = -x[7] * absx11 / x[4];
  194. c[p3] = -(x[3] * absx21 + x[6] * absx11) / x[0];
  195. c[p3 + 1] = absx21;
  196. c[p3 + 2] = absx11;
  197. }
  198. // 4*4 y = x^-1
  199. void Matrix_4X4_Inv(const real_T x[16], real_T y[16])
  200. {
  201. real_T A[16];
  202. int32_T i0;
  203. int8_T ipiv[4];
  204. int32_T j;
  205. int32_T jj;
  206. int32_T jp1j;
  207. int32_T pipk;
  208. int32_T ix;
  209. real_T smax;
  210. int32_T jA;
  211. real_T s;
  212. int32_T i;
  213. int8_T p[4];
  214. for (i0 = 0; i0 < 16; i0++)
  215. {
  216. y[i0] = 0.0f;
  217. A[i0] = x[i0];
  218. }
  219. for (i0 = 0; i0 < 4; i0++)
  220. {
  221. ipiv[i0] = (int8_T)(1 + i0);
  222. }
  223. for (j = 0; j < 3; j++)
  224. {
  225. jj = j * 5;
  226. jp1j = jj + 2;
  227. pipk = 1;
  228. ix = jj;
  229. smax = fabs(A[jj]);
  230. for (jA = 2; jA <= 4 - j; jA++)
  231. {
  232. ix++;
  233. s = fabs(A[ix]);
  234. if (s > smax)
  235. {
  236. pipk = jA;
  237. smax = s;
  238. }
  239. }
  240. if (A[(jj + pipk) - 1] != 0.0f)
  241. {
  242. if (pipk - 1 != 0)
  243. {
  244. ipiv[j] = (int8_T)(j + pipk);
  245. ix = j;
  246. pipk = (j + pipk) - 1;
  247. for (jA = 0; jA < 4; jA++)
  248. {
  249. smax = A[ix];
  250. A[ix] = A[pipk];
  251. A[pipk] = smax;
  252. ix += 4;
  253. pipk += 4;
  254. }
  255. }
  256. i0 = (jp1j - j) + 2;
  257. for (i = jp1j; i <= i0; i++)
  258. {
  259. A[i - 1] /= A[jj];
  260. }
  261. }
  262. jA = jj + 5;
  263. pipk = jj + 4;
  264. for (jj = 1; jj <= 3 - j; jj++)
  265. {
  266. smax = A[pipk];
  267. if (A[pipk] != 0.0f)
  268. {
  269. ix = jp1j;
  270. i0 = (jA - j) + 3;
  271. for (i = jA; i + 1 <= i0; i++)
  272. {
  273. A[i] += A[ix - 1] * -smax;
  274. ix++;
  275. }
  276. }
  277. pipk += 4;
  278. jA += 4;
  279. }
  280. }
  281. for (i0 = 0; i0 < 4; i0++)
  282. {
  283. p[i0] = (int8_T)(1 + i0);
  284. }
  285. for (jA = 0; jA < 3; jA++)
  286. {
  287. if (ipiv[jA] > 1 + jA)
  288. {
  289. pipk = p[ipiv[jA] - 1];
  290. p[ipiv[jA] - 1] = p[jA];
  291. p[jA] = (int8_T)pipk;
  292. }
  293. }
  294. for (jA = 0; jA < 4; jA++)
  295. {
  296. y[jA + ((p[jA] - 1) << 2)] = 1.0f;
  297. for (j = jA; j + 1 < 5; j++)
  298. {
  299. if (y[j + ((p[jA] - 1) << 2)] != 0.0f)
  300. {
  301. for (i = j + 1; i + 1 < 5; i++)
  302. {
  303. y[i + ((p[jA] - 1) << 2)] -= y[j + ((p[jA] - 1) << 2)] * A[i + (j << 2)];
  304. }
  305. }
  306. }
  307. }
  308. for (j = 0; j < 4; j++)
  309. {
  310. pipk = j << 2;
  311. for (jA = 3; jA > -1; jA += -1)
  312. {
  313. jj = jA << 2;
  314. if (y[jA + pipk] != 0.0f)
  315. {
  316. y[jA + pipk] /= A[jA + jj];
  317. for (i = 0; i + 1 <= jA; i++)
  318. {
  319. y[i + pipk] -= y[jA + pipk] * A[i + jj];
  320. }
  321. }
  322. }
  323. }
  324. }
  325. // 6*6 y = x^-1
  326. void Matrix_6X6_Inv(const real_T x[36], real_T y[36])
  327. {
  328. real_T A[36];
  329. int32_T i0;
  330. int8_T ipiv[6];
  331. int32_T j;
  332. int32_T jj;
  333. int32_T jp1j;
  334. int32_T pipk;
  335. int32_T ix;
  336. real_T smax;
  337. int32_T jA;
  338. real_T s;
  339. int32_T i;
  340. int8_T p[6];
  341. for (i0 = 0; i0 < 36; i0++)
  342. {
  343. y[i0] = 0.0f;
  344. A[i0] = x[i0];
  345. }
  346. for (i0 = 0; i0 < 6; i0++)
  347. {
  348. ipiv[i0] = (int8_T)(1 + i0);
  349. }
  350. for (j = 0; j < 5; j++)
  351. {
  352. jj = j * 7;
  353. jp1j = jj + 2;
  354. pipk = 1;
  355. ix = jj;
  356. smax = fabs(A[jj]);
  357. for (jA = 2; jA <= 6 - j; jA++) {
  358. ix++;
  359. s = fabs(A[ix]);
  360. if (s > smax) {
  361. pipk = jA;
  362. smax = s;
  363. }
  364. }
  365. if (A[(jj + pipk) - 1] != 0.0f) {
  366. if (pipk - 1 != 0) {
  367. ipiv[j] = (int8_T)(j + pipk);
  368. ix = j;
  369. pipk = (j + pipk) - 1;
  370. for (jA = 0; jA < 6; jA++) {
  371. smax = A[ix];
  372. A[ix] = A[pipk];
  373. A[pipk] = smax;
  374. ix += 6;
  375. pipk += 6;
  376. }
  377. }
  378. i0 = (jp1j - j) + 4;
  379. for (i = jp1j; i <= i0; i++) {
  380. A[i - 1] /= A[jj];
  381. }
  382. }
  383. jA = jj + 7;
  384. pipk = jj + 6;
  385. for (jj = 1; jj <= 5 - j; jj++) {
  386. smax = A[pipk];
  387. if (A[pipk] != 0.0f) {
  388. ix = jp1j;
  389. i0 = (jA - j) + 5;
  390. for (i = jA; i + 1 <= i0; i++) {
  391. A[i] += A[ix - 1] * -smax;
  392. ix++;
  393. }
  394. }
  395. pipk += 6;
  396. jA += 6;
  397. }
  398. }
  399. for (i0 = 0; i0 < 6; i0++) {
  400. p[i0] = (int8_T)(1 + i0);
  401. }
  402. for (jA = 0; jA < 5; jA++) {
  403. if (ipiv[jA] > 1 + jA) {
  404. pipk = p[ipiv[jA] - 1];
  405. p[ipiv[jA] - 1] = p[jA];
  406. p[jA] = (int8_T)pipk;
  407. }
  408. }
  409. for (jA = 0; jA < 6; jA++) {
  410. y[jA + 6 * (p[jA] - 1)] = 1.0f;
  411. for (j = jA; j + 1 < 7; j++) {
  412. if (y[j + 6 * (p[jA] - 1)] != 0.0f) {
  413. for (i = j + 1; i + 1 < 7; i++) {
  414. y[i + 6 * (p[jA] - 1)] -= y[j + 6 * (p[jA] - 1)] * A[i + 6 * j];
  415. }
  416. }
  417. }
  418. }
  419. for (j = 0; j < 6; j++)
  420. {
  421. pipk = 6 * j;
  422. for (jA = 5; jA > -1; jA += -1)
  423. {
  424. jj = 6 * jA;
  425. if (y[jA + pipk] != 0.0f)
  426. {
  427. y[jA + pipk] /= A[jA + jj];
  428. for (i = 0; i + 1 <= jA; i++)
  429. {
  430. y[i + pipk] -= y[jA + pipk] * A[i + jj];
  431. }
  432. }
  433. }
  434. }
  435. }
  436. // 7*7 y = x^-1
  437. void Matrix_7X7_Inv(const real_T x[49], real_T y[49])
  438. {
  439. real_T A[49];
  440. int32_T i0;
  441. int8_T ipiv[7];
  442. int32_T j;
  443. int32_T jj;
  444. int32_T jp1j;
  445. int32_T pipk;
  446. int32_T ix;
  447. real_T smax;
  448. int32_T jA;
  449. real_T s;
  450. int32_T i;
  451. int8_T p[7];
  452. for (i0 = 0; i0 < 49; i0++) {
  453. y[i0] = 0.0;
  454. A[i0] = x[i0];
  455. }
  456. for (i0 = 0; i0 < 7; i0++) {
  457. ipiv[i0] = (int8_T)(1 + i0);
  458. }
  459. for (j = 0; j < 6; j++) {
  460. jj = j << 3;
  461. jp1j = jj + 2;
  462. pipk = 1;
  463. ix = jj;
  464. smax = fabs(A[jj]);
  465. for (jA = 2; jA <= 7 - j; jA++) {
  466. ix++;
  467. s = fabs(A[ix]);
  468. if (s > smax) {
  469. pipk = jA;
  470. smax = s;
  471. }
  472. }
  473. if (A[(jj + pipk) - 1] != 0.0f) {
  474. if (pipk - 1 != 0) {
  475. ipiv[j] = (int8_T)(j + pipk);
  476. ix = j;
  477. pipk = (j + pipk) - 1;
  478. for (jA = 0; jA < 7; jA++) {
  479. smax = A[ix];
  480. A[ix] = A[pipk];
  481. A[pipk] = smax;
  482. ix += 7;
  483. pipk += 7;
  484. }
  485. }
  486. i0 = (jp1j - j) + 5;
  487. for (i = jp1j; i <= i0; i++) {
  488. A[i - 1] /= A[jj];
  489. }
  490. }
  491. jA = jj + 8;
  492. pipk = jj + 7;
  493. for (jj = 1; jj <= 6 - j; jj++) {
  494. smax = A[pipk];
  495. if (A[pipk] != 0.0f) {
  496. ix = jp1j;
  497. i0 = (jA - j) + 6;
  498. for (i = jA; i + 1 <= i0; i++) {
  499. A[i] += A[ix - 1] * -smax;
  500. ix++;
  501. }
  502. }
  503. pipk += 7;
  504. jA += 7;
  505. }
  506. }
  507. for (i0 = 0; i0 < 7; i0++) {
  508. p[i0] = (int8_T)(1 + i0);
  509. }
  510. for (jA = 0; jA < 6; jA++) {
  511. if (ipiv[jA] > 1 + jA) {
  512. pipk = p[ipiv[jA] - 1];
  513. p[ipiv[jA] - 1] = p[jA];
  514. p[jA] = (int8_T)pipk;
  515. }
  516. }
  517. for (jA = 0; jA < 7; jA++) {
  518. y[jA + 7 * (p[jA] - 1)] = 1.0f;
  519. for (j = jA; j + 1 < 8; j++) {
  520. if (y[j + 7 * (p[jA] - 1)] != 0.0f) {
  521. for (i = j + 1; i + 1 < 8; i++) {
  522. y[i + 7 * (p[jA] - 1)] -= y[j + 7 * (p[jA] - 1)] * A[i + 7 * j];
  523. }
  524. }
  525. }
  526. }
  527. for (j = 0; j < 7; j++) {
  528. pipk = 7 * j;
  529. for (jA = 6; jA > -1; jA += -1) {
  530. jj = 7 * jA;
  531. if (y[jA + pipk] != 0.0f) {
  532. y[jA + pipk] /= A[jA + jj];
  533. for (i = 0; i + 1 <= jA; i++) {
  534. y[i + pipk] -= y[jA + pipk] * A[i + jj];
  535. }
  536. }
  537. }
  538. }
  539. }
  540. // 10*10 y = x^-1
  541. void Matrix_10X10_Inv(const real_T x[100], real_T y[100])
  542. {
  543. real_T A[100];
  544. int32_T i0;
  545. int8_T ipiv[10];
  546. int32_T j;
  547. int32_T c;
  548. int32_T pipk;
  549. int32_T ix;
  550. real_T smax;
  551. int32_T k;
  552. real_T s;
  553. int32_T jy;
  554. int32_T ijA;
  555. int8_T p[10];
  556. for (i0 = 0; i0 < 100; i0++)
  557. {
  558. y[i0] = 0.0f;
  559. A[i0] = x[i0];
  560. }
  561. for (i0 = 0; i0 < 10; i0++)
  562. {
  563. ipiv[i0] = (int8_T)(1 + i0);
  564. }
  565. for (j = 0; j < 9; j++)
  566. {
  567. c = j * 11;
  568. pipk = 0;
  569. ix = c;
  570. smax = fabs(A[c]);
  571. for (k = 2; k <= 10 - j; k++)
  572. {
  573. ix++;
  574. s = fabs(A[ix]);
  575. if (s > smax)
  576. {
  577. pipk = k - 1;
  578. smax = s;
  579. }
  580. }
  581. if (A[c + pipk] != 0.0f)
  582. {
  583. if (pipk != 0)
  584. {
  585. ipiv[j] = (int8_T)((j + pipk) + 1);
  586. ix = j;
  587. pipk += j;
  588. for (k = 0; k < 10; k++)
  589. {
  590. smax = A[ix];
  591. A[ix] = A[pipk];
  592. A[pipk] = smax;
  593. ix += 10;
  594. pipk += 10;
  595. }
  596. }
  597. i0 = (c - j) + 10;
  598. for (jy = c + 1; jy + 1 <= i0; jy++)
  599. {
  600. A[jy] /= A[c];
  601. }
  602. }
  603. pipk = c;
  604. jy = c + 10;
  605. for (k = 1; k <= 9 - j; k++)
  606. {
  607. smax = A[jy];
  608. if (A[jy] != 0.0f)
  609. {
  610. ix = c + 1;
  611. i0 = (pipk - j) + 20;
  612. for (ijA = 11 + pipk; ijA + 1 <= i0; ijA++)
  613. {
  614. A[ijA] += A[ix] * -smax;
  615. ix++;
  616. }
  617. }
  618. jy += 10;
  619. pipk += 10;
  620. }
  621. }
  622. for (i0 = 0; i0 < 10; i0++)
  623. {
  624. p[i0] = (int8_T)(1 + i0);
  625. }
  626. for (k = 0; k < 9; k++)
  627. {
  628. if (ipiv[k] > 1 + k)
  629. {
  630. pipk = p[ipiv[k] - 1];
  631. p[ipiv[k] - 1] = p[k];
  632. p[k] = (int8_T)pipk;
  633. }
  634. }
  635. for (k = 0; k < 10; k++)
  636. {
  637. y[k + 10 * (p[k] - 1)] = 1.0f;
  638. for (j = k; j + 1 < 11; j++)
  639. {
  640. if (y[j + 10 * (p[k] - 1)] != 0.0f)
  641. {
  642. for (jy = j + 1; jy + 1 < 11; jy++)
  643. {
  644. y[jy + 10 * (p[k] - 1)] -= y[j + 10 * (p[k] - 1)] * A[jy + 10 * j];
  645. }
  646. }
  647. }
  648. }
  649. for (j = 0; j < 10; j++)
  650. {
  651. c = 10 * j;
  652. for (k = 9; k > -1; k += -1)
  653. {
  654. pipk = 10 * k;
  655. if (y[k + c] != 0.0f)
  656. {
  657. y[k + c] /= A[k + pipk];
  658. for (jy = 0; jy + 1 <= k; jy++)
  659. {
  660. y[jy + c] -= y[k + c] * A[jy + pipk];
  661. }
  662. }
  663. }
  664. }
  665. }
  666. //Mc = Ma' Ma = line * row
  667. void Matrix_Tran(const real_T *a, real_T *c, int line, int row)
  668. {
  669. int i0;
  670. int i1;
  671. for (i0 = 0; i0 < line; i0++)
  672. {
  673. for (i1 = 0; i1 < row; i1++)
  674. {
  675. c[i1*line + i0] = 0;
  676. c[i1*line + i0] = a[i0*row + i1];
  677. }
  678. }
  679. }
  680. // Ma * Mb = Mc ; Ma ==> al * ar ; Mb ==> bl * br
  681. void ML_R_X_ML_R(const real_T *a, const real_T *b, real_T *c, int al, int ar, int bl, int br)
  682. {
  683. int i0;
  684. int i1;
  685. int i2;
  686. #if 1
  687. for(i2 = 0; i2 < al * br; i2++)
  688. c[i2] = 0;
  689. #endif
  690. for(i2 = 0; i2 < br; i2++)
  691. {
  692. for (i0 = 0; i0 < al; i0++)
  693. {
  694. for (i1 = 0; i1 < bl; i1++)
  695. {
  696. c[i0 * br + i2] += a[i0 * ar + i1] * b[i1 * br + i2];
  697. }
  698. }
  699. }
  700. }
  701. void swap(float *a, float *b)
  702. {
  703. float c;
  704. c = *a;
  705. *a = *b;
  706. *b = c;
  707. }
  708. int inv(float *p,int n)
  709. {
  710. int *is,*js,i,j,k;
  711. float temp, fmax;
  712. is=(int *)malloc(n*sizeof(int));
  713. js=(int *)malloc(n*sizeof(int));
  714. for(k=0;k<n;k++)
  715. {
  716. fmax=0.0f;
  717. for(i=k;i<n;i++)
  718. for(j=k;j<n;j++)
  719. {
  720. temp=fabs(*(p+i*n+j));//????
  721. if(temp>fmax)
  722. {
  723. fmax=temp;
  724. is[k]=i;js[k]=j;
  725. }
  726. }
  727. if((fmax+1.0f)==1.0f)
  728. {
  729. free(is);
  730. free(js);
  731. return 0;
  732. }
  733. if((i=is[k])!=k)
  734. for(j=0;j<n;j++)
  735. swap((p+k*n+j),(p+i*n+j));//????
  736. if((j=js[k])!=k)
  737. for(i=0;i<n;i++)
  738. swap((p+i*n+k),(p+i*n+j)); //????
  739. p[k*n+k]=1.0f/p[k*n+k];
  740. for(j=0;j<n;j++)
  741. if(j!=k)
  742. p[k*n+j]*=p[k*n+k];
  743. for(i=0;i<n;i++)
  744. if(i!=k)
  745. for(j=0;j<n;j++)
  746. if(j!=k)
  747. p[i*n+j]=p[i*n+j]-p[i*n+k]*p[k*n+j];
  748. for(i=0;i<n;i++)
  749. if(i!=k)
  750. p[i*n+k]*=-p[k*n+k];
  751. }
  752. for(k=n-1;k>=0;k--)
  753. {
  754. if((j=js[k])!=k)
  755. for(i=0;i<n;i++)
  756. swap((p+j*n+i),(p+k*n+i));
  757. if((i=is[k])!=k)
  758. for(j=0;j<n;j++)
  759. swap((p+j*n+i),(p+j*n+k));
  760. }
  761. free(is);
  762. free(js);
  763. return 1;
  764. }