void test_infinity_norm(void) { /* double * infinity_norm( * const double *x, * int n * ); */ int i; for (i = 0; i < n; ++i) { x[i] = 0.; y[i] = 0.; } x[5] = 1.; y[1] = -2.; CU_ASSERT_EQUAL(1., infinity_norm(x, n)); CU_ASSERT_EQUAL(2., infinity_norm(y, n)); }
// a is the matrix you have, e is the one you'll fill in void padeExp(float *A, float *E, int n) { culaStatus status; float s; float *Q; float *I; float *A2; float *P; int i, j, f, *piv, scaled = 0; float c[POL + 1]; c[0] = 1; for (i = 0; i < POL; i++) { c[i + 1] = c[i]*((double)(POL - i)/((i + 1)*(2*POL - i))); } // scale here s = infinity_norm(A, n); if (s > 0.5) { scaled = 1; f = (int) (log(s)/log(2)); s = MAX(0,f + 2); status = culaSgemm('n', 'n', n, n, n, 0, A, n, A, n, pow(2, -s), A, n); checkCulaStatus(status); } // set up identity I = (float*)malloc(n*n*sizeof(float)); memset(I, 0, n*n*sizeof(float)); for (i = 0; i < n; i++) { I[i*n + i] = 1; } Q = (float*)malloc(n*n*sizeof(float)); P = (float*)malloc(n*n*sizeof(float)); memcpy(Q, I, n*n*sizeof(float)); memcpy(P, I, n*n*sizeof(float)); // allocate space for A2; no need to initialize memory A2 = (float*)malloc(n*n*sizeof(float)); status = culaSgemm('n', 'n', n, n, n, 1, A, n, A, n, 0, A2, n); checkCulaStatus(status); status = culaSgemm('n', 'n', n, n, n, 0, Q, n, Q, n, c[POL], Q, n); checkCulaStatus(status); status = culaSgemm('n', 'n', n, n, n, 0, P, n, P, n, c[POL - 1], P, n); checkCulaStatus(status); int odd = 1; for (i = POL - 2; i >= 0; i--) { if (odd == 1) { // Q = Q*A2 + c[k]*I; status = culaSgemm('n', 'n', n, n, n, 1, Q, n, A2, n, 0, Q, n); checkCulaStatus(status); status = culaSgemm('n', 'n', n, n, n, c[i], I, n, I, n, 1, Q, n); checkCulaStatus(status); } else { // P = P*A2 + c[k]*I status = culaSgemm('n', 'n', n, n, n, 1, P, n, A2, n, 0, P, n); checkCulaStatus(status); status = culaSgemm('n', 'n', n, n, n, c[i], I, n, I, n, 1, P, n); checkCulaStatus(status); } odd = 1-odd; } if (odd == 1) { // Q = Q*A status = culaSgemm('n', 'n', n, n, n, 1, Q, n, A, n, 0, Q, n); checkCulaStatus(status); } else { // P = P*A status = culaSgemm('n', 'n', n, n, n, 1, P, n, A, n, 0, P, n); checkCulaStatus(status); } // Q = Q - P status = culaSgemm('n', 'n', n, n, n, -1, P, n, I, n, 1, Q, n); checkCulaStatus(status); // Find X s.t. QX = P piv = (int*)malloc(n*sizeof(int)); memset(piv, 0, n*sizeof(int)); status = culaSgesv(n, n, Q, n, piv, P, n); checkCulaStatus(status); // now P = X memcpy(E, I, n*n*sizeof(float)); if (odd == 0) status = culaSgemm('n', 'n', n, n, n, 2, I, n, P, n, 1, E, n); else status = culaSgemm('n', 'n', n, n, n, -2, I, n, P, n, -1, E, n); checkCulaStatus(status); for(i = 0; i < s; i++) { status = culaSgemm('n', 'n', n, n, n, 1, E, n, E, n, 0, E, n); checkCulaStatus(status); } if (scaled == 1) { status = culaSgemm('n', 'n', n, n, n, 0, A, n, A, n, 1./pow(2, -s), A, n); checkCulaStatus(status); } free(I); free(A2); free(P); free(Q); free(piv); return; }