//
// main.c
// Test2
//
// Created by lianhua on 2014/9/20.
// Copyright (c) 2014年 lianhua. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
void binary(int N, const int n, int *b_vec)
{
int *ptr ;
int i ;
ptr = (int*)malloc(sizeof(int)*n);
for(i = 1; i <= n ; i++){
ptr[n-i] = N%2 ;
N = N/2;
}
for(i = 0; i < n; ++i){
b_vec[i]=ptr[i];
}
free(ptr) ;
}
void vectorM(int vec[], const int n, int m, int DM[n][m]){
int i,j;
int Coding_array[n] ;
for(j = 0; j < m; j++){
binary(vec[j],n,Coding_array);
for(i = 0; i<n; i++){
int *ptr = Coding_array;
DM[i][j] = 2*ptr[i]-1;
}
}
}
void Ltri1(const int m, int Matrix[m][m]){
int i, j ;
for(i = 0; i < m; i++){
for(j = 0; j < m; j++){
if(i <= j){
Matrix[i][j] = 0;
}else{
Matrix[i][j] = 1;
}
}
}
}
void TransM(const int m, const int n, int Mi[][m], int Mo[][m]){
int h, i, j ;
for(i = 0; i<m;i++){
for(j = 0; j<m; j++){
Mo[i][j] = 0 ;
for(h = 0; h<n; h++){
Mo[i][j] += Mi[h][i]*Mi[h][j];
}
}
}
}
static int n_step(int n)
{
if (n <= 1) return 1;
return n * n_step(n - 1);
}
double Es2(const int n, const int m, int vec[]){
int i, j;
int k = 0;
float a,b ;
int DM[n][m] ;
int TM[m][m] ;
int SM[m][m] ;
int VL[m][m] ;
vectorM(vec,n,m,DM);
Ltri1(m,TM);
TransM(m,n,DM,SM) ;
for(i = 0; i<m;i++){
for(j = 0; j<m; j++){
VL[i][j] = 0 ;
VL[i][j] = SM[i][j]*TM[i][j];
}
}
for(i = 0; i<m;i++){
for(j = 0; j<m; j++){
k = k+(VL[i][j]*VL[i][j]);
}
}
b = (n_step(m)/(n_step(2)*n_step(m-2))) ;
a = k/b ;
return a;
}
int find_index(int vec[], int a){
int j = 0;
while(vec[j]!=a){
j++;
}
return j;
}
int find_indexf(float vec[],float a){
int j = 0;
while(vec[j]!=a){
j++;
}
return j;
}
void array_delete(int vec[], int m, int b){
int j;
for(j = b; j< m-1;j++){
vec[j] = vec[j+1];
}
}
void array_insert(int vec[], int m, int p, int value){
int j ;
for(j = m-1; j>p; j--){
vec[j+1] = vec[j];
}
vec[p] = value;
}
void Delcol(const int n, const int m ,int vec[]){
int i, j;
int DM[n][m] ;
int TM[m][m] ;
int SM[m][m] ;
int delta_s2[m] ;
vectorM(vec,n,m,DM);
Ltri1(m,TM);
TransM(m,n,DM,SM) ;
for(i = 0; i<m;i++){
for(j = 0; j<m; j++){
if(SM[i][j]==n) SM[i][j] = 0 ;
else SM[i][j] = SM[i][j];
}
}
for(i = 0; i < m;i++){
int sum = 0;
for(j = 0; j<m; j++){
sum += SM[i][j]*SM[i][j] ;
}
delta_s2[i] = sum ;
}
int max = delta_s2[0] ;
for(i = 0; i < m;i++){
if(delta_s2[i] > max) max = delta_s2[i];
}
int idx = find_index(delta_s2,max);
array_delete(vec,m,idx);
}
void addcol(int vec_old[], int vec_ch[], int m, const int n, int rLB, int k){
int h, i, j ;
m = m-rLB+k;
int m_star = rLB-k ;
for(i = 0; i<m;i++){
int idx ;
idx = find_index(vec_ch,vec_old[i]);
array_delete(vec_ch,m,idx);
}
int DM1[n][m] ;
vectorM(vec_old,n,m,DM1);
int DM2[n][m_star] ;
vectorM(vec_ch,n,m_star,DM2);
int Mo[m][m_star] ;
for(i = 0; i<m;i++){
for(j = 0; j<m_star; j++){
Mo[i][j] = 0 ;
for(h = 0; h<n; h++){
Mo[i][j] += DM1[h][i]*DM2[h][j];
}
}
}
int delta_s2[m_star];
for(i = 0; i < m_star;i++){
int sum = 0;
for(j = 0; j<m; j++){
sum += Mo[j][i]*Mo[j][i] ;
}
delta_s2[i] = sum ;
}
int min = delta_s2[0] ;
for(i = 0; i < m_star;i++){
if(delta_s2[i] < min) min = delta_s2[i];
}
int idx = find_index(delta_s2,min);
array_insert(vec_old,m,m,vec_ch[idx]);
}
int main(int argc, char *argv[])
{
int i;
int m = 6 ;
int n = 4 ;
int rLB = 3;
int vec_old[3] = {6,12,5};
int vec_ch[6] = {10,9,3,6,12,5};
for(i = 0; i<rLB; i++) addcol(vec_old, vec_ch, m, n, rLB, i);
printf("%3d",vec_old);
printf("\n");
}