static void c_eml_qrsolve(const emlrtStack *sp, const emxArray_real_T *A, emxArray_real_T *B, emxArray_real_T *Y) { emxArray_real_T *b_A; emxArray_real_T *work; int32_T mn; int32_T i51; int32_T ix; emxArray_real_T *tau; emxArray_int32_T *jpvt; int32_T m; int32_T n; int32_T b_mn; emxArray_real_T *vn1; emxArray_real_T *vn2; int32_T k; boolean_T overflow; boolean_T b12; int32_T i; int32_T i_i; int32_T nmi; int32_T mmi; int32_T pvt; int32_T iy; boolean_T b13; real_T xnorm; int32_T i52; real_T atmp; real_T d16; boolean_T b14; boolean_T b_i; ptrdiff_t n_t; ptrdiff_t incx_t; double * xix0_t; boolean_T exitg1; const mxArray *y; static const int32_T iv78[2] = { 1, 8 }; const mxArray *m14; char_T cv76[8]; static const char_T cv77[8] = { '%', '%', '%', 'd', '.', '%', 'd', 'e' }; char_T cv78[14]; uint32_T unnamed_idx_0; emlrtStack st; emlrtStack b_st; emlrtStack c_st; emlrtStack d_st; emlrtStack e_st; emlrtStack f_st; emlrtStack g_st; emlrtStack h_st; st.prev = sp; st.tls = sp->tls; b_st.prev = &st; b_st.tls = st.tls; c_st.prev = &b_st; c_st.tls = b_st.tls; d_st.prev = &c_st; d_st.tls = c_st.tls; e_st.prev = &d_st; e_st.tls = d_st.tls; f_st.prev = &e_st; f_st.tls = e_st.tls; g_st.prev = &f_st; g_st.tls = f_st.tls; h_st.prev = &g_st; h_st.tls = g_st.tls; emlrtHeapReferenceStackEnterFcnR2012b(sp); emxInit_real_T(sp, &b_A, 2, &m_emlrtRTEI, true); b_emxInit_real_T(sp, &work, 1, &rb_emlrtRTEI, true); mn = (int32_T)muDoubleScalarMin(A->size[0], A->size[1]); st.site = &mc_emlrtRSI; b_st.site = &nc_emlrtRSI; c_st.site = &oc_emlrtRSI; i51 = b_A->size[0] * b_A->size[1]; b_A->size[0] = A->size[0]; b_A->size[1] = A->size[1]; emxEnsureCapacity(&c_st, (emxArray__common *)b_A, i51, (int32_T)sizeof(real_T), &m_emlrtRTEI); ix = A->size[0] * A->size[1]; for (i51 = 0; i51 < ix; i51++) { b_A->data[i51] = A->data[i51]; } b_emxInit_real_T(&c_st, &tau, 1, &m_emlrtRTEI, true); b_emxInit_int32_T(&c_st, &jpvt, 2, &m_emlrtRTEI, true); m = b_A->size[0]; n = b_A->size[1]; b_mn = muIntScalarMin_sint32(b_A->size[0], b_A->size[1]); i51 = tau->size[0]; tau->size[0] = b_mn; emxEnsureCapacity(&c_st, (emxArray__common *)tau, i51, (int32_T)sizeof(real_T), &n_emlrtRTEI); d_st.site = &mf_emlrtRSI; e_st.site = &rb_emlrtRSI; f_st.site = &sb_emlrtRSI; g_st.site = &tb_emlrtRSI; eml_signed_integer_colon(&g_st, b_A->size[1], jpvt); if ((b_A->size[0] == 0) || (b_A->size[1] == 0)) { } else { ix = b_A->size[1]; i51 = work->size[0]; work->size[0] = ix; emxEnsureCapacity(&c_st, (emxArray__common *)work, i51, (int32_T)sizeof (real_T), &m_emlrtRTEI); for (i51 = 0; i51 < ix; i51++) { work->data[i51] = 0.0; } b_emxInit_real_T(&c_st, &vn1, 1, &pb_emlrtRTEI, true); b_emxInit_real_T(&c_st, &vn2, 1, &qb_emlrtRTEI, true); d_st.site = &tc_emlrtRSI; ix = b_A->size[1]; i51 = vn1->size[0]; vn1->size[0] = ix; emxEnsureCapacity(&c_st, (emxArray__common *)vn1, i51, (int32_T)sizeof (real_T), &pb_emlrtRTEI); i51 = vn2->size[0]; vn2->size[0] = ix; emxEnsureCapacity(&c_st, (emxArray__common *)vn2, i51, (int32_T)sizeof (real_T), &qb_emlrtRTEI); k = 1; d_st.site = &nf_emlrtRSI; overflow = (b_A->size[1] > 2147483646); if (overflow) { e_st.site = &db_emlrtRSI; check_forloop_overflow_error(&e_st); } for (ix = 0; ix + 1 <= b_A->size[1]; ix++) { d_st.site = &sc_emlrtRSI; vn1->data[ix] = b_eml_xnrm2(&d_st, b_A->size[0], b_A, k); vn2->data[ix] = vn1->data[ix]; k += b_A->size[0]; } d_st.site = &rc_emlrtRSI; if (1 > b_mn) { b12 = false; } else { b12 = (b_mn > 2147483646); } if (b12) { e_st.site = &db_emlrtRSI; check_forloop_overflow_error(&e_st); } for (i = 1; i <= b_mn; i++) { i_i = (i + (i - 1) * m) - 1; nmi = n - i; mmi = m - i; d_st.site = &of_emlrtRSI; ix = eml_ixamax(&d_st, 1 + nmi, vn1, i); pvt = (i + ix) - 2; if (pvt + 1 != i) { d_st.site = &pf_emlrtRSI; e_st.site = &bc_emlrtRSI; f_st.site = &cc_emlrtRSI; ix = 1 + m * pvt; iy = 1 + m * (i - 1); g_st.site = &dc_emlrtRSI; if (1 > m) { b13 = false; } else { b13 = (m > 2147483646); } if (b13) { h_st.site = &db_emlrtRSI; check_forloop_overflow_error(&h_st); } for (k = 1; k <= m; k++) { i51 = b_A->size[0] * b_A->size[1]; xnorm = b_A->data[emlrtDynamicBoundsCheckFastR2012b(ix, 1, i51, &le_emlrtBCI, &f_st) - 1]; i51 = b_A->size[0] * b_A->size[1]; i52 = b_A->size[0] * b_A->size[1]; b_A->data[emlrtDynamicBoundsCheckFastR2012b(ix, 1, i51, &le_emlrtBCI, &f_st) - 1] = b_A->data[emlrtDynamicBoundsCheckFastR2012b(iy, 1, i52, &le_emlrtBCI, &f_st) - 1]; i51 = b_A->size[0] * b_A->size[1]; b_A->data[emlrtDynamicBoundsCheckFastR2012b(iy, 1, i51, &le_emlrtBCI, &f_st) - 1] = xnorm; ix++; iy++; } ix = jpvt->data[pvt]; jpvt->data[pvt] = jpvt->data[i - 1]; jpvt->data[i - 1] = ix; vn1->data[pvt] = vn1->data[i - 1]; vn2->data[pvt] = vn2->data[i - 1]; } if (i < m) { d_st.site = &qc_emlrtRSI; atmp = b_A->data[i_i]; d16 = 0.0; if (1 + mmi <= 0) { } else { e_st.site = &wc_emlrtRSI; xnorm = b_eml_xnrm2(&e_st, mmi, b_A, i_i + 2); if (xnorm != 0.0) { xnorm = muDoubleScalarHypot(b_A->data[i_i], xnorm); if (b_A->data[i_i] >= 0.0) { xnorm = -xnorm; } if (muDoubleScalarAbs(xnorm) < 1.0020841800044864E-292) { ix = 0; do { ix++; e_st.site = &xc_emlrtRSI; b_eml_xscal(&e_st, mmi, 9.9792015476736E+291, b_A, i_i + 2); xnorm *= 9.9792015476736E+291; atmp *= 9.9792015476736E+291; } while (!(muDoubleScalarAbs(xnorm) >= 1.0020841800044864E-292)); e_st.site = &yc_emlrtRSI; xnorm = b_eml_xnrm2(&e_st, mmi, b_A, i_i + 2); xnorm = muDoubleScalarHypot(atmp, xnorm); if (atmp >= 0.0) { xnorm = -xnorm; } d16 = (xnorm - atmp) / xnorm; e_st.site = &ad_emlrtRSI; b_eml_xscal(&e_st, mmi, 1.0 / (atmp - xnorm), b_A, i_i + 2); e_st.site = &bd_emlrtRSI; if (1 > ix) { b14 = false; } else { b14 = (ix > 2147483646); } if (b14) { f_st.site = &db_emlrtRSI; check_forloop_overflow_error(&f_st); } for (k = 1; k <= ix; k++) { xnorm *= 1.0020841800044864E-292; } atmp = xnorm; } else { d16 = (xnorm - b_A->data[i_i]) / xnorm; atmp = 1.0 / (b_A->data[i_i] - xnorm); e_st.site = &cd_emlrtRSI; b_eml_xscal(&e_st, mmi, atmp, b_A, i_i + 2); atmp = xnorm; } } } tau->data[i - 1] = d16; } else { atmp = b_A->data[i_i]; d_st.site = &pc_emlrtRSI; tau->data[i - 1] = eml_matlab_zlarfg(); } b_A->data[i_i] = atmp; if (i < n) { atmp = b_A->data[i_i]; b_A->data[i_i] = 1.0; d_st.site = &qf_emlrtRSI; eml_matlab_zlarf(&d_st, mmi + 1, nmi, i_i + 1, tau->data[i - 1], b_A, i + i * m, m, work); b_A->data[i_i] = atmp; } d_st.site = &rf_emlrtRSI; if (i + 1 > n) { b_i = false; } else { b_i = (n > 2147483646); } if (b_i) { e_st.site = &db_emlrtRSI; check_forloop_overflow_error(&e_st); } for (ix = i; ix + 1 <= n; ix++) { if (vn1->data[ix] != 0.0) { xnorm = muDoubleScalarAbs(b_A->data[(i + b_A->size[0] * ix) - 1]) / vn1->data[ix]; xnorm = 1.0 - xnorm * xnorm; if (xnorm < 0.0) { xnorm = 0.0; } atmp = vn1->data[ix] / vn2->data[ix]; atmp = xnorm * (atmp * atmp); if (atmp <= 1.4901161193847656E-8) { if (i < m) { d_st.site = &sf_emlrtRSI; e_st.site = &uc_emlrtRSI; if (mmi < 1) { xnorm = 0.0; } else { f_st.site = &vc_emlrtRSI; g_st.site = &vc_emlrtRSI; n_t = (ptrdiff_t)(mmi); g_st.site = &vc_emlrtRSI; incx_t = (ptrdiff_t)(1); i51 = b_A->size[0] * b_A->size[1]; i52 = (i + m * ix) + 1; xix0_t = (double *)(&b_A->data[emlrtDynamicBoundsCheckFastR2012b (i52, 1, i51, &vb_emlrtBCI, &f_st) - 1]); xnorm = dnrm2(&n_t, xix0_t, &incx_t); } vn1->data[ix] = xnorm; vn2->data[ix] = vn1->data[ix]; } else { vn1->data[ix] = 0.0; vn2->data[ix] = 0.0; } } else { d_st.site = &tf_emlrtRSI; vn1->data[ix] *= muDoubleScalarSqrt(xnorm); } } } } emxFree_real_T(&vn2); emxFree_real_T(&vn1); } atmp = 0.0; if (mn > 0) { xnorm = muDoubleScalarMax(A->size[0], A->size[1]) * muDoubleScalarAbs (b_A->data[0]) * 2.2204460492503131E-16; k = 0; exitg1 = false; while ((!exitg1) && (k <= mn - 1)) { if (muDoubleScalarAbs(b_A->data[k + b_A->size[0] * k]) <= xnorm) { st.site = &lc_emlrtRSI; y = NULL; m14 = emlrtCreateCharArray(2, iv78); for (i = 0; i < 8; i++) { cv76[i] = cv77[i]; } emlrtInitCharArrayR2013a(&st, 8, m14, cv76); emlrtAssign(&y, m14); b_st.site = &tg_emlrtRSI; emlrt_marshallIn(&b_st, c_sprintf(&b_st, b_sprintf(&b_st, y, emlrt_marshallOut(14.0), emlrt_marshallOut(6.0), &o_emlrtMCI), emlrt_marshallOut(xnorm), &p_emlrtMCI), "sprintf", cv78); st.site = &kc_emlrtRSI; b_eml_warning(&st, atmp, cv78); exitg1 = true; } else { atmp++; k++; } } } unnamed_idx_0 = (uint32_T)A->size[1]; i51 = Y->size[0]; Y->size[0] = (int32_T)unnamed_idx_0; emxEnsureCapacity(sp, (emxArray__common *)Y, i51, (int32_T)sizeof(real_T), &m_emlrtRTEI); ix = (int32_T)unnamed_idx_0; for (i51 = 0; i51 < ix; i51++) { Y->data[i51] = 0.0; } for (ix = 0; ix < mn; ix++) { if (tau->data[ix] != 0.0) { xnorm = B->data[ix]; i51 = A->size[0] + (int32_T)(1.0 - ((1.0 + (real_T)ix) + 1.0)); emlrtForLoopVectorCheckR2012b((1.0 + (real_T)ix) + 1.0, 1.0, A->size[0], mxDOUBLE_CLASS, i51, &ac_emlrtRTEI, sp); for (i = 0; i < i51; i++) { unnamed_idx_0 = ((uint32_T)ix + i) + 2U; xnorm += b_A->data[((int32_T)unnamed_idx_0 + b_A->size[0] * ix) - 1] * B->data[(int32_T)unnamed_idx_0 - 1]; } xnorm *= tau->data[ix]; if (xnorm != 0.0) { B->data[ix] -= xnorm; i51 = A->size[0] + (int32_T)(1.0 - ((1.0 + (real_T)ix) + 1.0)); emlrtForLoopVectorCheckR2012b((1.0 + (real_T)ix) + 1.0, 1.0, A->size[0], mxDOUBLE_CLASS, i51, &yb_emlrtRTEI, sp); for (i = 0; i < i51; i++) { unnamed_idx_0 = ((uint32_T)ix + i) + 2U; B->data[(int32_T)unnamed_idx_0 - 1] -= b_A->data[((int32_T) unnamed_idx_0 + b_A->size[0] * ix) - 1] * xnorm; } } } } emxFree_real_T(&tau); emlrtForLoopVectorCheckR2012b(1.0, 1.0, atmp, mxDOUBLE_CLASS, (int32_T)atmp, &xb_emlrtRTEI, sp); for (i = 0; i < (int32_T)atmp; i++) { Y->data[jpvt->data[i] - 1] = B->data[i]; } emlrtForLoopVectorCheckR2012b(atmp, -1.0, 1.0, mxDOUBLE_CLASS, (int32_T)-(1.0 + (-1.0 - atmp)), &wb_emlrtRTEI, sp); for (ix = 0; ix < (int32_T)-(1.0 + (-1.0 - atmp)); ix++) { xnorm = atmp + -(real_T)ix; Y->data[jpvt->data[(int32_T)xnorm - 1] - 1] = eml_div(Y->data[jpvt->data [(int32_T)xnorm - 1] - 1], b_A->data[((int32_T)xnorm + b_A->size[0] * ((int32_T)xnorm - 1)) - 1]); for (i = 0; i < (int32_T)(xnorm - 1.0); i++) { Y->data[jpvt->data[i] - 1] -= Y->data[jpvt->data[(int32_T)xnorm - 1] - 1] * b_A->data[i + b_A->size[0] * ((int32_T)xnorm - 1)]; } } emxFree_int32_T(&jpvt); emxFree_real_T(&work); emxFree_real_T(&b_A); emlrtHeapReferenceStackLeaveFcnR2012b(sp); }
static void eml_qrsolve(const emxArray_real_T *A, emxArray_real_T *B, double Y[2], double *rankR) { emxArray_real_T *b_A; int m; int mn; int i6; int itemp; int b_m; int b_mn; double tau_data[2]; signed char jpvt[2]; double work[2]; int i; int k; double vn1[2]; double vn2[2]; int pvt; double smax; int i_i; int mmi; double temp2; int ix; int iy; double atmp; int lastv; int lastc; boolean_T exitg2; int32_T exitg1; double t; unsigned int b_i; emxInit_real_T(&b_A, 2); m = A->size[0] - 2; mn = (int)fmin(A->size[0], 2.0) - 1; i6 = b_A->size[0] * b_A->size[1]; b_A->size[0] = A->size[0]; b_A->size[1] = 2; emxEnsureCapacity((emxArray__common *)b_A, i6, (int)sizeof(double)); itemp = A->size[0] * A->size[1]; for (i6 = 0; i6 < itemp; i6++) { b_A->data[i6] = A->data[i6]; } b_m = b_A->size[0]; if (b_A->size[0] <= 2) { b_mn = b_A->size[0]; } else { b_mn = 2; } for (i6 = 0; i6 < 2; i6++) { jpvt[i6] = (signed char)(1 + i6); } if (b_A->size[0] == 0) { } else { for (i = 0; i < 2; i++) { work[i] = 0.0; } k = 1; for (pvt = 0; pvt < 2; pvt++) { smax = eml_xnrm2(b_m, b_A, k); vn2[pvt] = smax; k += b_m; vn1[pvt] = smax; } for (i = 0; i + 1 <= b_mn; i++) { i_i = i + i * b_m; mmi = (b_m - i) - 1; itemp = 0; if (2 - i > 1) { smax = fabs(vn1[i]); k = 2; while (k <= 2 - i) { temp2 = fabs(vn1[1]); if (temp2 > smax) { itemp = 1; smax = temp2; } k = 3; } } pvt = i + itemp; if (pvt + 1 != i + 1) { ix = b_m * pvt; iy = b_m * i; for (k = 1; k <= b_m; k++) { smax = b_A->data[ix]; b_A->data[ix] = b_A->data[iy]; b_A->data[iy] = smax; ix++; iy++; } itemp = jpvt[pvt]; jpvt[pvt] = jpvt[i]; jpvt[i] = (signed char)itemp; vn1[pvt] = vn1[i]; vn2[pvt] = vn2[i]; } if (i + 1 < b_m) { atmp = b_A->data[i_i]; temp2 = 0.0; if (1 + mmi <= 0) { } else { smax = b_eml_xnrm2(mmi, b_A, i_i + 2); if (smax != 0.0) { smax = hypot(b_A->data[i_i], smax); if (b_A->data[i_i] >= 0.0) { smax = -smax; } if (fabs(smax) < 1.0020841800044864E-292) { pvt = 0; do { pvt++; eml_xscal(mmi, 9.9792015476736E+291, b_A, i_i + 2); smax *= 9.9792015476736E+291; atmp *= 9.9792015476736E+291; } while (!(fabs(smax) >= 1.0020841800044864E-292)); smax = b_eml_xnrm2(mmi, b_A, i_i + 2); smax = hypot(atmp, smax); if (atmp >= 0.0) { smax = -smax; } temp2 = (smax - atmp) / smax; eml_xscal(mmi, 1.0 / (atmp - smax), b_A, i_i + 2); for (k = 1; k <= pvt; k++) { smax *= 1.0020841800044864E-292; } atmp = smax; } else { temp2 = (smax - b_A->data[i_i]) / smax; eml_xscal(mmi, 1.0 / (b_A->data[i_i] - smax), b_A, i_i + 2); atmp = smax; } } } tau_data[i] = temp2; } else { atmp = b_A->data[i_i]; tau_data[i] = eml_matlab_zlarfg(); } b_A->data[i_i] = atmp; if (i + 1 < 2) { atmp = b_A->data[i_i]; b_A->data[i_i] = 1.0; if (tau_data[0] != 0.0) { lastv = mmi + 1; itemp = i_i + mmi; while ((lastv > 0) && (b_A->data[itemp] == 0.0)) { lastv--; itemp--; } lastc = 1; exitg2 = false; while ((!exitg2) && (lastc > 0)) { itemp = b_m + 1; do { exitg1 = 0; if (itemp <= b_m + lastv) { if (b_A->data[itemp - 1] != 0.0) { exitg1 = 1; } else { itemp++; } } else { lastc = 0; exitg1 = 2; } } while (exitg1 == 0); if (exitg1 == 1) { exitg2 = true; } } } else { lastv = 0; lastc = 0; } if (lastv > 0) { if (lastc == 0) { } else { work[0] = 0.0; iy = 0; pvt = 1 + b_m; while ((b_m > 0) && (pvt <= b_m + 1)) { ix = i_i; smax = 0.0; i6 = (pvt + lastv) - 1; for (itemp = pvt; itemp <= i6; itemp++) { smax += b_A->data[itemp - 1] * b_A->data[ix]; ix++; } work[iy] += smax; iy++; pvt += b_m; } } if (-tau_data[0] == 0.0) { } else { k = b_m; iy = 0; pvt = 1; while (pvt <= lastc) { if (work[iy] != 0.0) { smax = work[iy] * -tau_data[0]; ix = i_i; i6 = lastv + k; for (itemp = k; itemp + 1 <= i6; itemp++) { b_A->data[itemp] += b_A->data[ix] * smax; ix++; } } iy++; k += b_m; pvt = 2; } } } b_A->data[i_i] = atmp; } pvt = i + 2; while (pvt < 3) { itemp = (i + b_m) + 1; if (vn1[1] != 0.0) { smax = fabs(b_A->data[i + b_A->size[0]]) / vn1[1]; smax = 1.0 - smax * smax; if (smax < 0.0) { smax = 0.0; } temp2 = vn1[1] / vn2[1]; temp2 = smax * (temp2 * temp2); if (temp2 <= 1.4901161193847656E-8) { if (i + 1 < b_m) { smax = 0.0; if (mmi < 1) { } else if (mmi == 1) { smax = fabs(b_A->data[itemp]); } else { temp2 = 2.2250738585072014E-308; pvt = itemp + mmi; while (itemp + 1 <= pvt) { atmp = fabs(b_A->data[itemp]); if (atmp > temp2) { t = temp2 / atmp; smax = 1.0 + smax * t * t; temp2 = atmp; } else { t = atmp / temp2; smax += t * t; } itemp++; } smax = temp2 * sqrt(smax); } vn1[1] = smax; vn2[1] = smax; } else { vn1[1] = 0.0; vn2[1] = 0.0; } } else { vn1[1] *= sqrt(smax); } } pvt = 3; } } } *rankR = 0.0; if (mn + 1 > 0) { smax = fmax(A->size[0], 2.0) * fabs(b_A->data[0]) * 2.2204460492503131E-16; k = 0; while ((k <= mn) && (!(fabs(b_A->data[k + b_A->size[0] * k]) <= smax))) { (*rankR)++; k++; } } for (i = 0; i < 2; i++) { Y[i] = 0.0; } for (pvt = 0; pvt <= mn; pvt++) { if (tau_data[pvt] != 0.0) { smax = B->data[pvt]; i6 = m - pvt; for (i = 0; i <= i6; i++) { b_i = ((unsigned int)pvt + i) + 2U; smax += b_A->data[((int)b_i + b_A->size[0] * pvt) - 1] * B->data[(int) b_i - 1]; } smax *= tau_data[pvt]; if (smax != 0.0) { B->data[pvt] -= smax; i6 = m - pvt; for (i = 0; i <= i6; i++) { b_i = ((unsigned int)pvt + i) + 2U; B->data[(int)b_i - 1] -= b_A->data[((int)b_i + b_A->size[0] * pvt) - 1] * smax; } } } } for (i = 0; i <= mn; i++) { Y[jpvt[i] - 1] = B->data[i]; } for (pvt = 0; pvt <= mn; pvt++) { itemp = mn - pvt; Y[jpvt[itemp] - 1] /= b_A->data[itemp + b_A->size[0] * itemp]; i = 0; while (i <= itemp - 1) { Y[jpvt[0] - 1] -= Y[jpvt[itemp] - 1] * b_A->data[b_A->size[0] * itemp]; i = 1; } } emxFree_real_T(&b_A); }