void VU_cmprintm_f(char s[], vsip_cmview_f *X) { char format[50]; vsip_length RL = vsip_cmgetrowlength_f(X); vsip_length CL = vsip_cmgetcollength_f(X); vsip_length row,col; vsip_cscalar_f x; strcpy(format,"(%"); strcat(format,s); strcat(format,"f %+"); strcat(format,s); strcat(format,"fi) %s"); printf("[\n"); for(row=0; row<CL; row++){ for(col=0; col<RL; col++){ x=vsip_cmget_f(X,row,col); printf(format,vsip_real_f(x), vsip_imag_f(x), ((col==(RL-1)) ? ";" : " ")); } printf("\n"); } printf("];\n"); return; }
void VU_copu_f( vsip_cmview_f *A, vsip_cvview_f *x, vsip_cvview_f *y) { vsip_length m = vsip_cmgetcollength_f(A); vsip_length n = vsip_cmgetrowlength_f(A); vsip_length i,j; vsip_cscalar_f temp; for(i=0; i<m; i++) for(j=0; j<n; j++){ temp = vsip_cmul_f(vsip_cvget_f(x,i),vsip_cvget_f(y,j)); vsip_cmput_f(A,i,j,vsip_cadd_f(vsip_cmget_f(A,i,j),temp)); } return; }
void VU_cmprint_f(vsip_cmview_f *X) { vsip_length RL = vsip_cmgetrowlength_f(X); vsip_length CL = vsip_cmgetcollength_f(X); vsip_length row,col; vsip_cscalar_f x; printf("[\n"); for(row=0; row<CL; row++){ for(col=0; col<RL; col++){ x=vsip_cmget_f(X,row,col); printf("(%6.4f %+6.4fi%s ",vsip_real_f(x),vsip_imag_f(x),((col==(RL-1)) ? ");" : ")")); } printf("\n"); } printf("];\n"); return; }
/* matrix copy by col */ PyObject *cmcopyToListByCol_f(vsip_cmview_f *v){ PyObject *cval; vsip_length M = vsip_cmgetcollength_f(v); vsip_length N = vsip_cmgetrowlength_f(v); PyObject *retval = PyList_New(M); vsip_index i,j; for(j=0; j<N; j++){ PyObject *col = PyList_New(M); for(i=0; i<M; i++){ vsip_cscalar_f x = vsip_cmget_f(v,i,j); double re = (double)x.r; double im = (double)x.i; cval = PyComplex_FromDoubles(re,im); PyList_SetItem(col,i,cval); } PyList_SetItem(retval,j,col); } return retval; }
int main(){vsip_init((void*)0); { vsip_cmview_f *A = vsip_cmcreate_f(M,P,VSIP_ROW,0), *B = vsip_cmcreate_f(N,P,VSIP_ROW,0), *R = vsip_cmcreate_f(M,N,VSIP_ROW,0); int i, j; for(i=0;i<M;i++) for(j=0;j<P;j++) vsip_cmput_f(A,i,j,vsip_cmplx_f(i,1 + sqrt(i*j))); for(i=0;i<N;i++) for(j=0;j<P;j++) vsip_cmput_f(B,i,j,vsip_cmplx_f(1 , i * j)); printf("\n A input \n"); vsip_cmprodh_f(A,B,R); {for(i=0;i<M;i++) {for(j=0;j<P;j++){ printf(": (%5.2f, %5.2f) ", vsip_real_f(vsip_cmget_f(A,i,j)), vsip_imag_f(vsip_cmget_f(A,i,j))); } printf(":\n"); } } printf("\n B input \n"); {for(i=0;i<N;i++) {for(j=0;j<P;j++){ printf(": (%5.2f, %5.2f) ", vsip_real_f(vsip_cmget_f(B,i,j)), vsip_imag_f(vsip_cmget_f(B,i,j))); } printf(":\n"); } } printf("\n R output \n"); {for(i=0;i<M;i++) {for(j=0;j<N;j++){ printf(": (%5.2f, %5.2f) ", vsip_real_f(vsip_cmget_f(R,i,j)), vsip_imag_f(vsip_cmget_f(R,i,j))); } printf(":\n"); } } vsip_cmalldestroy_f(A); vsip_cmalldestroy_f(B); vsip_cmalldestroy_f(R); } vsip_finalize((void*)0); return 0; }
int main(){vsip_init((void*)0); { int i,j, solretval=0; vsip_cmview_f *A = vsip_cmcreate_f(M,N,VSIP_COL,0); vsip_cmview_f *X = vsip_cmcreate_f(M,NB,VSIP_ROW,0); /* Nullify the data-space */ for (i=0; i < vsip_cmgetcollength_f(A); i++) for(j=0; j < vsip_cmgetrowlength_f(A); j++) vsip_cmput_f(A,i,j,vsip_cmplx_f(0,0)); for (i=0; i < vsip_cmgetcollength_f(X); i++) for(j=0; j < vsip_cmgetrowlength_f(X); j++) vsip_cmput_f(X,i,j,vsip_cmplx_f(0,0)); /* Initialise matrix A */ for (i=0; i<M; i++) for (j = 0; j < N; j++) if(i == j) vsip_cmput_f(A,i,j,vsip_cmplx_f(M+1, 0)); else if(i > j) vsip_cmput_f(A,i,j, vsip_cmplx_f(1,1)); else if(i < j) vsip_cmput_f(A,i,j,vsip_cmplx_f(1,-1)); {int i,j; printf("A matrix\nA = [\n"); for(i=0; i<M; i++) { for(j=0; j< N; j++) printf("%6.2f+%6.2fi%s", vsip_real_f(vsip_cmget_f(A,i,j)), vsip_imag_f(vsip_cmget_f(A,i,j)),(j == N-1) ? "":","); (i == M - 1) ? printf("]\n") : printf(";\n"); } } { int j, k; vsip_cvview_f *y = NULL; vsip_cvview_f *x; vsip_vview_f *yr = NULL, *yi = NULL; vsip_length L = NB; vsip_length p = M; for(k=0; k<L; k++) { x = vsip_cmcolview_f(X,k); for (j=0; j<p; j++) { y = vsip_cmrowview_f(A,j); yr = vsip_vrealview_f(y); yi = vsip_vimagview_f(y); vsip_cvput_f(x,j, vsip_cmplx_f((double)(k+1)*(vsip_vsumval_f(yr)), (double) (k+1)*(vsip_vsumval_f(yi)))); /* vsip_vput_f(x,j,(vsip_vsumval_f(y)));*/ vsip_cvdestroy_f(y); vsip_vdestroy_f(yr); vsip_vdestroy_f(yi); } vsip_cvdestroy_f(x); } } {int i,j; printf("rhs matrix\nB = [\n"); for(i=0; i<NN; i++) { for(j=0; j<NB; j++) printf("%7.2f+%7.2fi%s", vsip_real_f(vsip_cmget_f(X,i,j)), vsip_imag_f(vsip_cmget_f(X,i,j)),(j == NB-1) ? "":","); (i == NN - 1) ? printf("]\n") : printf(";\n"); } } {vsip_cqr_f* qrAop = vsip_cqrd_create_f(M,N, QOPT); if(qrAop == NULL) exit(1); {int i,j; printf("matrix A after factorisation\n R/Q -- \n"); if(QOPT == VSIP_QRD_SAVEQ1) { printf("qrd } returns %i\n",vsip_cqrd_f(qrAop,A)); printf("matrix A after factorisation: skinny Q explicitly\n Q1 = [\n"); for(i= 0; i< M ; i++) { for(j=0; j< N; j++) printf("%8.4f+%8.4fi%s", vsip_real_f(vsip_cmget_f(A,i,j)), vsip_imag_f(vsip_cmget_f(A,i,j)),(j == N-1) ? "":","); (i == M - 1) ? printf("]\n") : printf(";\n"); } } else if(QOPT == VSIP_QRD_SAVEQ || QOPT == VSIP_QRD_NOSAVEQ) { printf("qrd returns %i\n",vsip_cqrd_f(qrAop,A)); printf("matrix A after fact.: R and "); (QOPT == VSIP_QRD_SAVEQ) ? printf("full Q implicitly\n Q/R = [\n") : printf("Q not saved -- ignore LT portion. \n R = [\n"); for(i= 0; i<M ; i++) { for(j=0; j< N; j++) printf("%9.5f+%9.5fi%s", vsip_real_f(vsip_cmget_f(A,i,j)), vsip_imag_f(vsip_cmget_f(A,i,j)),(j == N-1) ? "":","); (i == M - 1) ? printf("]\n") : printf(";\n"); } } } if( QPROB == VSIP_LLS) { if (QOPT == VSIP_QRD_SAVEQ1 || QOPT == VSIP_QRD_SAVEQ) { if((solretval=vsip_cqrsol_f(qrAop, QPROB, X))) { printf("WARNING -- Least Squares soln returns %i-- CHECK\n", solretval); printf("Upper triang. mat. R, possibly singular\n"); } else printf("Least Squares soln returns %i\n", solretval); } else { printf("Least Squares systems cannot be solved by the NOSAVEQ option -- exiting\n"); exit(1); } } else { if((solretval=vsip_cqrsol_f(qrAop,QPROB, X))) { printf("Covariance soln returns %i\n",solretval); printf("Upper triang. mat. R, possibly singular\n"); } else printf("Covariance soln returns %i\n",solretval); } vsip_cqrd_destroy_f(qrAop); } {int i,j; printf("Soln Matrix\nX = [\n"); for(i=0; i<N; i++) { for(j=0; j<NB; j++) printf("%9.5f+%9.5fi%s", vsip_real_f(vsip_cmget_f(X,i,j)), vsip_imag_f(vsip_cmget_f(X,i,j)),(j == NB-1) ? "":","); (i == N - 1) ? printf("]\n") : printf(";\n"); } } vsip_cmalldestroy_f(X); vsip_cmalldestroy_f(A); } vsip_finalize((void*)0); return 1; }
int main(int argc, char *argv[]){vsip_init((void*)0); { if(argc < 3){ printf("usage\nqrdex M N FileName\n"); exit(1); } { /* get some data */ vsip_length M = (vsip_length)atoi(argv[1]), N = (vsip_length)atoi(argv[2]); vsip_cmview_f *A = vsip_cmcreate_f(M,N,VSIP_COL,0), *Q = vsip_cmcreate_f(M,N,VSIP_ROW,0); vsip_scalar_f *beta = (vsip_scalar_f*)malloc(N * sizeof(vsip_scalar_f)); FILE *fptr = fopen(argv[3],"r"); VU_cmreadf_f(fptr,A); fclose(fptr); vsip_cmcopy_f_f(A,Q); printf("input matrix A \n"); printf("A =");VU_cmprintm_f("6.4",A); VU_chouseqr_f(Q,beta); /* make a QR matrix, keep the betas */ printf("Decomposed A with R in upper, \n"); printf("and householder vector in lower \n"); printf("householder value on diagonal is 1\n"); printf("v(2:m)\\R =");VU_cmprintm_f("6.4",Q); { /* Multiply Q times R to see if we get A */ vsip_length i,j; vsip_cmview_f *R = vsip_cmcreate_f(M,N,VSIP_ROW,0); vsip_cvview_f *r = vsip_cmrowview_f(R,0); vsip_cvputlength_f(r,N * M); vsip_cvfill_f(vsip_cmplx_f(0,0),r); for(i=0; i<N; i++) /* extract R */ for(j = i; j<N; j++) vsip_cmput_f(R,i,j,vsip_cmget_f(Q,i,j)); VU_cqprodm_f(R,Q,beta); /* Q * R */ printf("Multiply Q times R and see if we get A\n"); printf("QR = \n"); VU_cmprintm_f("6.4",R); vsip_cvdestroy_f(r); vsip_cmalldestroy_f(R); } { /* Multiply I * Q to get Q */ vsip_cmview_f *I = vsip_cmcreate_f(M,M,VSIP_ROW,0); vsip_cvview_f *I_rv = vsip_cmrowview_f(I,0); vsip_cvputlength_f(I_rv,M * M); vsip_cvfill_f(vsip_cmplx_f(0.0,0.0),I_rv); vsip_cvputlength_f(I_rv,M); vsip_cvputstride_f(I_rv,M+1); vsip_cvfill_f(vsip_cmplx_f(1.0,0.0),I_rv); printf("Using an Identity matrix extract Q using Householdoer update\n"); printf("I = \n"); VU_cmprintm_f("6.4",I); VU_cqprodm_f(I,Q,beta); printf("Q = \n"); VU_cmprintm_f("6.4",I); { /* Multiply Q hermitian * A to get R */ vsip_cmview_f *AC = vsip_cmcreate_f(M,N,VSIP_COL,0); vsip_cmview_f *QT = vsip_cmtransview_f(I); vsip_cmview_f *R = vsip_cmcreate_f(M,N,VSIP_ROW,0); vsip_cmprodj_f(QT,A,R); VU_cmconjIP_f(R); printf("Using Q from above mutiply Hermitian(Q) times A to get R\n"); printf("QT * A = R = \n"); VU_cmprintm_f("6.4",R); vsip_cmcopy_f_f(A,AC); printf("Using Householder update multiply Transpose(Q) times A to get R\n"); VU_cqhprodm_f(AC,Q,beta); printf("QT * AC = R = \n"); VU_cmprintm_f("6.4",AC); { vsip_cmview_f *QTQ = vsip_cmcreate_f(M,M,VSIP_ROW,0); vsip_cmprodj_f(QT,I,QTQ); printf("QT * Q = I = \n"); VU_cmprintm_f("6.4",QTQ); vsip_cmalldestroy_f(QTQ); } vsip_cmdestroy_f(QT); vsip_cmalldestroy_f(R); } { /* general Multiply */ vsip_cmview_f *J = vsip_cmcreate_f(M,2 * M,VSIP_ROW,0); vsip_cmview_f *K = vsip_cmcreate_f(M,2 * M,VSIP_ROW,0); vsip_cvview_f *J_rv = vsip_cmrowview_f(J,0); vsip_cvputlength_f(J_rv,2 * M * M); vsip_cvfill_f(vsip_cmplx_f(2.0,-1.0),J_rv); vsip_cvputlength_f(J_rv,M); vsip_cvputstride_f(J_rv,2 * M+1); vsip_cvfill_f(vsip_cmplx_f(1.0,1.0),J_rv); vsip_cvputoffset_f(J_rv,M); vsip_cvfill_f(vsip_cmplx_f(3.0,0.0),J_rv); printf("Make a big matrix J to test with \n"); printf("J = \n"); VU_cmprintm_f("6.4",J); vsip_cmprod_f(I,J,K); VU_cqprodm_f(J,Q,beta); printf("Multiply Q * J using Householder update \n"); printf("J = \n"); VU_cmprintm_f("6.4",J); printf("Multiply Q * J using Q extracted above \n"); printf("K = \n"); VU_cmprintm_f("6.4",K); printf("\n"); { vsip_cmview_f *JT = vsip_cmtransview_f(J); vsip_cmview_f *KT = vsip_cmtransview_f(K); VU_cmconjIP_f(JT); printf("Conjugate Transpose the current J (overwritten by the above operation\n"); printf("JT = \n"); VU_cmprintm_f("6.4",JT); vsip_cmprod_f(JT,I,KT); VU_cmprodq_f(JT,Q,beta); printf("Multiply hermitian(J) * Q using Householder update \n"); printf("JT = \n"); VU_cmprintm_f("6.4",JT); printf("Multiply hermitian(J) * Q using Q extracted above \n"); printf("KT = \n"); VU_cmprintm_f("6.4",KT); vsip_cmdestroy_f(JT); vsip_cmdestroy_f(KT); } { vsip_cmview_f *QT = vsip_cmtransview_f(I); VU_cmconjIP_f(QT); vsip_cmprod_f(QT,J,K); VU_cqhprodm_f(J,Q,beta); printf("Transpose JT to J, multiply transpose(Q) * J using Householder\n"); printf("J = \n"); VU_cmprintm_f("6.4",J); printf("Transpose JT to J, multiply transpose(Q) * J using Q extracted above\n"); printf("K = \n"); VU_cmprintm_f("6.4",K); { vsip_cmview_f* JT = vsip_cmtransview_f(J); vsip_cmview_f* KT = vsip_cmtransview_f(K); VU_cmconjIP_f(JT); vsip_cmprod_f(JT,QT,KT); VU_cmconjIP_f(QT); printf("Transpose J, Multiply J * transpose(Q) using Q extracted above\n"); printf("K = \n"); VU_cmprintm_f("6.4",KT); VU_cmprodqh_f(JT,Q,beta); VU_cmconjIP_f(JT); printf("Transpose J, Multiply J * transpose(Q) using Householder\n"); printf("J = \n"); VU_cmprintm_f("6.4",JT); vsip_cmdestroy_f(JT); vsip_cmdestroy_f(KT); } vsip_cmdestroy_f(QT); } { vsip_cmview_f *I2 = vsip_cmcreate_f(M,M,VSIP_ROW,0); vsip_cmview_f *I2t = vsip_cmtransview_f(I2); vsip_cmcopy_f_f(I,I2); VU_cmprodqh_f(I2,Q,beta); printf("test mprodqh QQh =\n"); VU_cmprintm_f("6.4",I2); vsip_cmcopy_f_f(I,I2);VU_cmconjIP_f(I2);VU_cqprodm_f(I2t,Q,beta); printf("test qprodm QQh =\n"); VU_cmprintm_f("6.4",I2); vsip_cmcopy_f_f(I,I2); VU_cqhprodm_f(I2,Q,beta); printf("test qhprodm QhQ =\n"); VU_cmprintm_f("6.4",I2); vsip_cmcopy_f_f(I,I2);VU_cmconjIP_f(I2);VU_cmprodq_f(I2t,Q,beta); printf("test mprodq QhQ =\n"); VU_cmprintm_f("6.4",I2); vsip_cmdestroy_f(I2t); vsip_cmalldestroy_f(I2); } } vsip_cvdestroy_f(I_rv); vsip_cmalldestroy_f(I); } vsip_cmalldestroy_f(A); vsip_cmalldestroy_f(Q); free(beta); } vsip_finalize((void*)0); return 0; } }