static MATRIX * align_pca(MRI *mri_in, MRI *mri_ref) { int row, col, i ; float dot ; MATRIX *m_ref_evectors = NULL, *m_in_evectors = NULL ; float in_evalues[3], ref_evalues[3] ; double ref_means[3], in_means[3] ; #if 0 MRI *mri_in_windowed, *mri_ref_windowed ; mri_in_windowed = MRIwindow(mri_in, NULL, WINDOW_HANNING,127,127,127,100.0f); mri_ref_windowed = MRIwindow(mri_ref,NULL,WINDOW_HANNING,127,127,127,100.0f); if (Gdiag & DIAG_WRITE) { MRIwriteImageViews(mri_in_windowed, "in_windowed", 400) ; MRIwriteImageViews(mri_ref_windowed, "ref_windowed", 400) ; } #endif if (!m_ref_evectors) m_ref_evectors = MatrixAlloc(3,3,MATRIX_REAL) ; if (!m_in_evectors) m_in_evectors = MatrixAlloc(3,3,MATRIX_REAL) ; MRIprincipleComponents(mri_ref, m_ref_evectors, ref_evalues, ref_means, thresh_low); MRIprincipleComponents(mri_in,m_in_evectors,in_evalues,in_means,thresh_low); /* check to make sure eigenvectors aren't reversed */ for (col = 1 ; col <= 3 ; col++) { #if 0 float theta ; #endif for (dot = 0.0f, row = 1 ; row <= 3 ; row++) dot += m_in_evectors->rptr[row][col] * m_ref_evectors->rptr[row][col] ; if (dot < 0.0f) { printf("WARNING: mirror image detected in eigenvector #%d\n", col) ; dot *= -1.0f ; for (row = 1 ; row <= 3 ; row++) m_in_evectors->rptr[row][col] *= -1.0f ; } #if 0 theta = acos(dot) ; printf("angle[%d] = %2.1f\n", col, DEGREES(theta)) ; #endif } printf("ref_evectors = \n") ; for (i = 1 ; i <= 3 ; i++) printf("\t\t%2.2f %2.2f %2.2f\n", m_ref_evectors->rptr[i][1], m_ref_evectors->rptr[i][2], m_ref_evectors->rptr[i][3]) ; printf("\nin_evectors = \n") ; for (i = 1 ; i <= 3 ; i++) printf("\t\t%2.2f %2.2f %2.2f\n", m_in_evectors->rptr[i][1], m_in_evectors->rptr[i][2], m_in_evectors->rptr[i][3]) ; return(pca_matrix(m_in_evectors, in_means,m_ref_evectors, ref_means)) ; }
static MATRIX * compute_pca(MRI *mri_in, MRI *mri_ref) { int row, col, i ; float dot ; MATRIX *m_ref_evectors = NULL, *m_in_evectors = NULL ; float in_evalues[3], ref_evalues[3] ; double ref_means[3], in_means[3] ; if (!m_ref_evectors) m_ref_evectors = MatrixAlloc(3,3,MATRIX_REAL) ; if (!m_in_evectors) m_in_evectors = MatrixAlloc(3,3,MATRIX_REAL) ; if (binarize) { MRIbinaryPrincipleComponents(mri_ref, m_ref_evectors, ref_evalues, ref_means, thresh_low); MRIbinaryPrincipleComponents(mri_in,m_in_evectors,in_evalues,in_means, thresh_low); } else { MRIprincipleComponents(mri_ref, m_ref_evectors, ref_evalues, ref_means, thresh_low); MRIprincipleComponents(mri_in,m_in_evectors,in_evalues,in_means, thresh_low); } order_eigenvectors(m_in_evectors, m_in_evectors) ; order_eigenvectors(m_ref_evectors, m_ref_evectors) ; /* check to make sure eigenvectors aren't reversed */ for (col = 1 ; col <= 3 ; col++) { #if 0 float theta ; #endif for (dot = 0.0f, row = 1 ; row <= 3 ; row++) dot += m_in_evectors->rptr[row][col] * m_ref_evectors->rptr[row][col] ; if (dot < 0.0f) { fprintf(stderr, "WARNING: mirror image detected in eigenvector #%d\n", col) ; dot *= -1.0f ; for (row = 1 ; row <= 3 ; row++) m_in_evectors->rptr[row][col] *= -1.0f ; } #if 0 theta = acos(dot) ; fprintf(stderr, "angle[%d] = %2.1f\n", col, DEGREES(theta)) ; #endif } fprintf(stderr, "ref_evectors = \n") ; for (i = 1 ; i <= 3 ; i++) fprintf(stderr, "\t\t%2.2f %2.2f %2.2f\n", m_ref_evectors->rptr[i][1], m_ref_evectors->rptr[i][2], m_ref_evectors->rptr[i][3]) ; fprintf(stderr, "\nin_evectors = \n") ; for (i = 1 ; i <= 3 ; i++) fprintf(stderr, "\t\t%2.2f %2.2f %2.2f\n", m_in_evectors->rptr[i][1], m_in_evectors->rptr[i][2], m_in_evectors->rptr[i][3]) ; return(pca_matrix(m_in_evectors, in_means,m_ref_evectors, ref_means)) ; }