Note that there are some explanatory texts on larger screens.

plurals
  1. POIssues with getting an index of an array [C]
    primarykey
    data
    text
    <p>I'm writing a program that sends an array through a function (upperhess) that will turn it from a square nxn matrix into an upper hessenberg matrix. This is running fine, but then i need to send the array through another function, which I am having an issue with. I need to make a double equal to the first element of the array. However, instead it is setting the double (mu) equal to zero. I included my code below</p> <hr> <pre><code>#include &lt;stdio.h&gt; #include &lt;math.h&gt; int idx(int r, int c, int n) { return r * n + c; } void transpose(double *a, int n, double *at) { for (int i = 0; i &lt; n; i++) { for (int j = 0; j &lt; n; j++) { at[(idx (i, j, n))] = a[(idx (j, i, n))]; } } } void matrix_multiplication(double *a, double *b, int n, double *combo) { for (int i = 0; i &lt; n; i++) { for (int j = 0; j &lt; n; j++) { combo[(idx(i, j, n))] = 0; for (int k = 0; k &lt; n; k++) { combo[(idx(i, j, n))] += a[(idx(i, k, n))] * b[(idx(k, j, n))]; } } } } void identity(double *a, int n) { for (int i = 0; i &lt; n; i++) { for (int j = 0; j &lt; n; j++) { if (i == j) { a[(idx(i, j, n))] = 1; } else { a[(idx(i, j, n))] = 0; } } } } void upperhes(double *a, int n, double *u, double *b) { //Sets b equal to a for (int i = 0; i &lt; (n*n); i++) { b[i] = a[i]; } //Sets u equal to the identity matrix identity(u, n); int times = 0; for (int i = 0; i &lt; (n-2); i++) { for (int j = n-1; j &gt; (1 + times); j--) { double c, s, r; r = sqrt((b[(idx(j-1,i,n))] * b[(idx(j-1,i,n))]) + (b[(idx(j,i,n))] * b[(idx(j,i,n))])); if (r &lt; 0) { r = (-1 * r); } if (r &lt; pow(10,-50)) { c = 1; s = 0; } else { c = b[(idx(j-1, i, n))] / r; s = (-1 * b[(idx(j, i, n))]) / r; } //store takes the original values of specific points in matrix b and stores them, so the values of b can be manipulated double store[6]; store[0] = b[(idx(j-1, i,n))]; store[1] = b[(idx(j,i,n))]; store[4] = b[(idx(i,j-1,n))]; store[5] = b[(idx(i,j,n))]; b[(idx (j,i,n))] = (s * store[0]) + (c * store[1]); b[(idx(j-1,i,n))] = (c * store[0]) + (-s * store[1]); for (int k= i+1; k&lt;n; k++) { store[2] = b[(idx(j-1,k,n))]; store[3] = b[(idx(j,k,n))]; b[(idx(j-1,k,n))] = (c * store[2]) - (s * store[3]); b[(idx(j,k,n))] = (s * store[2]) + (c * store[3]); } b[(idx (i, j, n))] = (s * store[4]) + (c * store[5]); b[(idx (i, j-1, n))] = (c * store[4]) - (s * store[5]); for (int k = i + 1; k &lt; n; k++) { store[2] = b[(idx(k, j-1, n))]; store[3] = b[(idx(k, j, n))]; b[idx(k, j-1, n)] = (c * store[2]) - (s * store[3]); b[idx(k, j, n)] = (s * store[2]) + (c * store[3]); } store[0] = u[(idx(j-1, 0, n))]; store[1] = u[(idx(j, 0, n))]; u[idx (j, 0, n)] = (s * store[0]) + (c * store[1]); u[idx(j-1, 0, n)] = (c * store[0]) + (-s * store[1]); for (int k= 1; k&lt;n; k++) { store[2] = u[idx(j-1, k, n)]; store[3] = u[idx(j, k, n)]; u[idx(j-1, k, n)] = (c * store[2]) - (s * store[3]); u[idx(j, k, n)] = (s * store[2]) + (c * store[3]); } } times++; } //Sets ut equal to the transpose of u double ut[n*n]; transpose(u, n, ut); //Multiplies u and a together. double ua[(n*n)]; matrix_multiplication(u, a, n, ua); double b_check[(n*n)]; matrix_multiplication(ua, ut, n, b_check); //Prints out the matrix! for(int i=0; i&lt;n; i++){ for(int j =0; j&lt;n; j++){ printf("(%+.3f)\t", b[(idx (i,j,n))]); } printf("\n\n"); } printf("\n"); } void two_through_five(double *b, int n, double *eigenvalues, int total) { for (int times = 0; times &lt; 100; times++){ double mu = b[0]; .......... } } void qr_symmetric(double *a, int n, double *b) { //Creates a tridiagonal matrix by using a method that creates upper Hessenberg matrices on a symmetrical matrix a. double u[n * n]; upperhes(a, n, u, b); //Creates an array to store the eigenvalues double eigenvalues[n]; two_through_five(b, n, eigenvalues, n); for (int i = 0; i &lt; n; i++) { printf("%d\t", eigenvalues[n]); } printf("\n"); } int main(void) { int n; n = 4; double a[(n*n)]; a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4; a[4] = 2; a[5] = 6; a[6] = 7; a[7] = 8; a[8] = 3; a[9] = 7; a[10] = 11; a[11] = 15; a[12] = 4; a[13] = 8; a[14] = 15; a[15] = 16; double b[n * n]; qr_symmetric(a, n, b); return 0; } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload