亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? svd.cpp

?? 一個(gè)可分解上萬階稀疏矩陣的SVD算法
?? CPP
字號(hào):
// SVD.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fstream.h>
#ifndef EPSILON
#define EPSILON 0.000000001
#endif
 
void inputtext();
void decompose();
void shrinkvector();
void outputtext(double *S, double *U, double *V);
int symeigen(double *eigen,double *AN,double *U);
extern int singdec( double *A, double *singular,
        		     double *U, double *V);
void computVS();

struct element
{
	int row;   
	int col;
	double value;
 
};
typedef struct element ELEMENT;

struct elementchain
{
	ELEMENT data;
	struct elementchain *next;
};
typedef struct elementchain ELEMENTCHAIN;


int mm;
int nn;
int precision=9;
double *finalVS;
double *A;
double *finalU;
double *finalV;
double *finalS;
int finalR;
ELEMENTCHAIN *inputmatrix;





//=========================================================================================
void main(int argc, char* argv[])
{
   inputtext();
   decompose();
   computVS();
   shrinkvector();
   outputtext(finalS,finalU,finalV);
}







//========================================================================================
int singdec( double *A, double *singular,
            double *U, double *V)
{
int i,j,jj,l,rank;
int rowA,colA,valueA;
static double sum,*vj,*eigen,*ATA,*U1;
ELEMENTCHAIN *test,*matrixA,*colI,*colJ,*tempcolI,*tempcolJ,*nextI,*nextJ;
int ci,cj;
  
vj=new double[mm];
U1=new double[nn*nn];
ATA=new double[nn*nn];
 
eigen = new double[nn];
 
for(i=0;i<nn;i++)
  {
  for(j=0;j<nn;j++)
  {
  
	ci=i;
	cj=j;
   
    colI=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
    colJ=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
	test=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
    nextI=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
    nextJ=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
    nextI=colI;
    nextJ=colJ;
 	matrixA=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
 	matrixA=inputmatrix->next;
	//把一個(gè)鏈表分解成兩個(gè)鏈表;
    while (matrixA!=NULL)
	{
	   if (matrixA->data.col==ci)
		{
		   tempcolI=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
		   tempcolI->data=matrixA->data;
		   nextI->next=tempcolI;
		   nextI=tempcolI;
		}

	    if (matrixA->data.col==cj)
		{
		   tempcolJ=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
		   tempcolJ->data=matrixA->data;
	       nextJ->next=tempcolJ;
		   nextJ=tempcolJ;
	 	}
		matrixA=matrixA->next;
		test=colI;
	}
       nextI->next=NULL;
       nextJ->next=NULL;
 	   //計(jì)算ATA矩陣;
       tempcolI=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
       tempcolI=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
       tempcolI=colI->next;
       tempcolJ=colJ->next;  
 	   ATA[i*nn+j]=0.0;
  while((tempcolI!=NULL)&&(tempcolJ!=NULL))
   {
    if (tempcolI->data.row > tempcolJ->data.row)
		tempcolJ=tempcolJ->next;
	else if (tempcolI->data.row==tempcolJ->data.row)
	   {
	  	ATA[i*nn+j]+=tempcolI->data.value*tempcolJ->data.value;
	    tempcolI=tempcolI->next;   
		tempcolJ=tempcolJ->next;
	}
	else tempcolI=tempcolI->next;
   }
 
  }
  }

rank=symeigen( eigen, ATA, U );
for(i=0;i<rank;i++) singular[i]=sqrt(eigen[i]);
for(j=0;j<rank;j++)
  for(i=0;i<nn;i++) U1[i*nn+j]=U[i*nn+j]/singular[j];
for(i=0;i<mm;i++)
  {
  for(j=0;j<rank;j++)
    {
    V[i*mm+j]=0.0;
    for(l=0;l<nn;l++) V[i*mm+j]=V[i*mm+j]+A[i*nn+l]*U1[l*nn+j];
    }
  }
for(j=rank;j<mm;j++)
  {
  sum=0.0;                               /*for creat vj[]*/

  for(i=0;i<mm;i++) { vj[i]=rand(); sum=sum+vj[i]*vj[i]; }
  sum=sqrt(sum);
  for(i=0;i<nn;i++) vj[i]=vj[i]/sum;      /* vj[] is created*/
  for(jj=0;jj<j;jj++)
    {
    sum=0.0;
    for(i=0;i<mm;i++) sum=sum+vj[i]*V[i*mm+jj];
    for(i=0;i<mm;i++) vj[i]=vj[i]-sum*V[i*mm+jj];
    }
  sum=0.0;
  for(i=0;i<mm;i++) sum=sum+vj[i]*vj[i];
  sum=sqrt(sum);
  for(i=0;i<mm;i++) V[i*mm+j]=vj[j]/sum;
  }
return( rank );
}


/***************By using power and inverse power method to compute all
  eigenvalues and eigenvectos of symmetric matrix eigens. ***********/
double invpower(int init, double *fx0, double *B );
void power( int fs, double *fx0, double *A );
double lamb1,*V;





//================================================================================
int symeigen(double *eigen,double *A,double *V0)
{
int i,l,j,step,rank;
static double *B,*x0,mlamb;

V=new double[nn*nn];
x0=new double[nn];
B=new double[nn*nn];
for(i=0;i<nn;i++)
  { eigen[i]=0.0; for(j=0;j<nn;j++) V[i*nn+j]=0.0; }
rank=0;
for(step=0;step<nn;step++)
  {
  power(step,x0,A);
  if(lamb1==0.0) { eigen[step]=0.0; goto bbb; }
  mlamb=lamb1;
  for(i=0;i<nn;i++)
    {
    for(j=0;j<nn;j++) B[i*nn+j]=A[i*nn+j];
    B[i*nn+i]=A[i*nn+i]-lamb1;
    }
  lamb1=invpower( 1, x0, B );
  if( fabs(lamb1) > EPSILON ) eigen[step]=mlamb+1.0/lamb1;
  if(lamb1==0.0) eigen[step]=mlamb;
bbb:if( fabs(eigen[step]) > EPSILON ) rank=rank+1;
  for(i=0;i<nn;i++) V[i*nn+step]=x0[i];
  }
for(i=0;i<nn;i++)
   for(j=0;j<nn;j++) V0[i*nn+j]=V[i*nn+j];
return(rank);
}







//===========================================================================================
void power(int i0,double *x0,double *A)
{
static double *x1,lamb,sum,err,err1,eps;
int i,j,jj,ii;
eps=EPSILON*1000.0;
raa:ii=0;
x1=new double[nn];      
/*for creat x0[]*/
for(j=0;j<i0;j++) { for(i=0;i<nn;i++) x0[0]=rand(); }
sum=0.0;
for(i=0;i<nn;i++)
  { x0[i]=rand(); sum=sum+x0[i]*x0[i]; }
sum=sqrt(sum);
if( sum < EPSILON ) goto raa;
for(i=0;i<nn;i++) x1[i]=x0[i]/sum;      /* x0[] is created*/
lamb=0.5;
goto bbb;
aaa:ii=ii+1;
    for(j=0;j<nn;j++)
      {
      x1[j]=0.0;
      for(jj=0;jj<nn;jj++) x1[j]=x1[j]+A[j*nn+jj]*x0[jj];
      }
    lamb1=0.0;
    for(j=0;j<nn;j++) lamb1=lamb1+x0[j]*x1[j];
    if( fabs(lamb1) < EPSILON )
       {
       lamb1=0.0; err=0.0; err1=0.0;
       for(j=0;j<nn;j++) x1[j]=x0[j];
       goto bbb;
       }
    else
       { err=fabs(lamb1-lamb); err1=err/fabs(lamb1); }
    lamb=lamb1;
bbb:if(i0>0)
      {
      for(i=0;i<i0;i++)
        {
        sum=0.0;
        for(j=0;j<nn;j++) sum=sum+x1[j]*V[j*nn+i];
        for(j=0;j<nn;j++) x1[j]=x1[j]-sum*V[j*nn+i];
        }
      }
sum=0.0;
for(j=0;j<nn;j++) sum=sum+x1[j]*x1[j];
sum=sqrt(sum);
if( sum < EPSILON ) goto endd;
for(j=0;j<nn;j++) x0[j]=x1[j]/sum;
if( ii < 10 ) goto aaa;
if( ( err > eps ) || (err1 > eps) ) goto aaa;
endd:;
}






/******************************************************************======================**/
double invpower( int init, double *x0, double *B )
{
int i,j,k,i0,istep,*ik;
static double *x1,lamb,lamb1,sum,err,temp;
x1=new double[nn];
ik=new int[nn];
istep=0;
if( init == 0 )              /* for creat x0[] */
  {

raa: sum=0.0;
  for(i=0;i<nn;i++)
    { x0[i]=rand(); sum=sum+x0[i]*x0[i]; }
  sum=sqrt(sum);
  if( sum < EPSILON ) goto raa;
  for(i=0;i<nn;i++) x0[i]=x0[i]/sum;      /* x0[] is created*/
  }
for(k=0;k<nn;k++)                /*colum pivot Doolittle decompsition*/
  {
  temp=fabs( B[k*nn+k] );       ik[k]=k;
  for(i=k;i<nn;i++)
    if( fabs(B[i*nn+k]) > temp ) { temp=fabs(B[i*nn+k]); ik[k]=i; }
  i0=ik[k];
  if( i0 != k )
    {
    for(j=0;j<nn;j++)
      { temp=B[k*nn+j]; B[k*nn+j]=B[i0*nn+j]; B[i0*nn+j]=temp; }
    }
  if( fabs(B[k*nn+k]) < EPSILON ) { lamb1=0.0; goto end; }
  for(i=k+1;i<nn;i++)
    {
    B[i*nn+k]=B[i*nn+k]/B[k*nn+k];
    for(j=k+1;j<nn;j++) B[i*nn+j]=B[i*nn+j]-B[i*nn+k]*B[k*nn+j];
    }
  }                       /* decompsition is ended */
aaa:istep=istep+1;
    lamb=lamb1;
    for(j=0;j<nn;j++) x1[j]=x0[j];
    for(i=0;i<nn;i++)                             /* solut LR=Px0[] */
      { j=ik[i]; temp=x0[i]; x0[i]=x0[j]; x0[j]=temp; }
    for(i=1;i<nn;i++)
      for(j=0;j<i;j++) x0[i]=x0[i]-B[i*nn+j]*x0[j];
    for(i=nn-1;i>=0;i--)
      {
      for(j=i+1;j<nn;j++) x0[i]=x0[i]-B[i*nn+j]*x0[j];
      x0[i]=x0[i]/B[i*nn+i];
      }                                         /* end for solution */
    lamb1=0.0;
    for(j=0;j<nn;j++) lamb1=lamb1+x0[j]*x1[j];
    err=fabs(lamb1-lamb)/fabs(lamb1);
    sum=0.0;
    for(j=0;j<nn;j++) sum=sum+x0[j]*x0[j];
    sum=sqrt(sum);
    for(j=0;j<nn;j++) x0[j]=x0[j]/sum;
    if( istep > 2000 )
      {
      printf("Iterative 2000 times! Strike any key to exit.\n");
 
      exit(1);
      }
    if( err>100.0*EPSILON ) goto aaa;
end: return(lamb1) ;
}





//====================================================================================
void inputtext()
{
    //從文本中讀入矩陣;分出行和列,并把矩陣存入數(shù)組;	 
    double AA;
    int i;
	int rownum,colnum;
	ELEMENTCHAIN *tempelement;
	ELEMENTCHAIN *nextelement;

	ifstream fileA("c:\\SVD\\A.txt");
	ofstream filetemp("c:\\SVD\\tempfile.txt");

	fileA>>AA;
	mm=int(AA);

	fileA>>AA;
	nn=int(AA);

	inputmatrix=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
    nextelement=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
//	tempelement=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));

	nextelement=inputmatrix;

	A=new double[mm*nn];
    i=0;
   
           for (rownum=0;rownum<mm;rownum++)
			   for (colnum=0;colnum<nn;colnum++)
			   {
		   
		              fileA>>AA;
	                  A[i]=AA;
		              i++;

					 if (AA !=0)
					  {
						 
						 tempelement=(ELEMENTCHAIN *)malloc(sizeof(ELEMENTCHAIN));
						 tempelement->data.row=rownum;
						 tempelement->data.col=colnum;
    					 tempelement->data.value=AA;
                    	 nextelement->next=tempelement;
						 nextelement=tempelement;
						 
                      }

				}

			   	  nextelement->next=NULL;
				  nextelement=inputmatrix->next;

                        while(nextelement!=NULL)
						{
                
						 filetemp<<nextelement->data.row
							     <<"   "
							     <<nextelement->data.col
								 <<"   "
								 <<nextelement->data.value
								 <<"   "
								 <<"\n";
			                nextelement=nextelement->next;


						} 
}






//==========================================================================================
void decompose()
{

 static double *U,*V,*singular; 
 U=new double[nn*nn];
 V=new double[mm*mm];
 singular=new double[nn];
 finalS=new double[nn];
 finalU=new double[nn*nn];
 finalV=new double[mm*mm];
 
 int i,j,jj,l,rank;

 system("cls"); //文件初始化;

 rank=singdec( A, singular, U, V );
 finalR=rank;
 
 for(i=0;i<nn;i++) 
  	 finalS[i]=singular[i];
  
 for(i=0;i<mm;i++)
 	 for(j=0;j<mm;j++)  
         finalV[i*mm+j]=V[i*mm+j];
  
 for(i=0;i<nn;i++)
  for(j=0;j<nn;j++) 
   finalU[i*nn+j]=U[i*nn+j];
   
}





//======================================================================================

void outputtext(double *S, double *U, double *V)
{
	//分別輸出三個(gè)數(shù)組到三個(gè)文件中;
    int i,j;

	ofstream arrayS("c:\\SVD\\S.txt");
	arrayS<<"The rank="
	   <<finalR
	   <<"\n";
	arrayS.precision(precision);
	arrayS<<"The singulars:\n";
	 
    for(i=0;i<nn;i++) 
	 arrayS<<finalS[i]
	       <<"     ";
	 
    ofstream arrayV("c:\\SVD\\V.txt");
	arrayV<<"The matrix V:\n";
	arrayV.precision(precision);
    for(i=0;i<mm;i++)
	{
	 for(j=0;j<mm;j++)  
	 {
	    arrayV<<finalV[i*mm+j]
	            <<"     ";
	    if (finalV[i*mm+j]<0)
		  arrayV<<" "; 
	 }
	  arrayV<<"\n";
	}
   
   ofstream arrayU("c:\\SVD\\U.txt");
   arrayU<<"The matrix U:\n";
   arrayU.precision(precision);
   for(i=0;i<nn;i++)
   {
      for(j=0;j<nn;j++) 
	  {
		 arrayU<<finalU[i*nn+j]
		       <<"     ";
	      if (finalU[i*nn+j]<0)
			 arrayU<<" ";
	  }
         arrayU<<"\n";
   }

   printf("Complete decomposed!\n");

}






//=======================================================================================
void computVS()
{
   int i,j;
   double *tempS,*matrixS;

   ofstream arrayVS("c:\\SVD\\VS.txt");	
   
   finalVS=new double[mm*finalR];
   tempS=new double[mm*nn];
   matrixS=new double[nn*mm];

   for(i=0;i<mm;i++)
	   for(j=0;j<finalR;j++)
	   {
		      finalVS[i*finalR+j]=finalV[i*finalR+j]/finalS[j];
		      
	   }
  
}





//====================================================================================
void shrinkvector()
{
	double *xin,*xout;

	xin=new double[mm];
    xout=new double[finalR];
	ifstream fileIn("c:\\SVD\\Xin.txt");
	ofstream fileOut("c:\\SVD\\Xout.txt");
    
	for (int i=0;i<mm;i++)
		fileIn>>xin[i];
    
	for(i=0;i<finalR;i++)
	{
	   xout[i]=0;
       for(int j=0;j<nn;j++)
          xout[i]+=xin[j]*finalVS[j*nn+i];
    }

	for(i=0;i<finalR;i++)
		fileOut<<xout[i]
		       <<".......";
}













?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲观看高清完整版在线观看| 国产色综合久久| 国产精品一区二区久久精品爱涩 | 国产欧美视频一区二区三区| 欧美亚日韩国产aⅴ精品中极品| 国内精品免费**视频| 亚洲欧洲av在线| 精品毛片乱码1区2区3区| 在线视频亚洲一区| 丁香亚洲综合激情啪啪综合| 日韩电影在线观看电影| 亚洲色图欧洲色图婷婷| 国产亚洲人成网站| 精品少妇一区二区三区免费观看 | 精品一区二区三区蜜桃| 亚洲444eee在线观看| 亚洲码国产岛国毛片在线| 久久精品亚洲国产奇米99| 欧美一级视频精品观看| 欧美系列在线观看| 91免费国产在线| 99麻豆久久久国产精品免费| 国产成人在线视频网址| 国模少妇一区二区三区| 久久国产综合精品| 日韩精品电影在线观看| 亚洲国产日韩一区二区| 亚洲精品国产高清久久伦理二区| 国产精品无圣光一区二区| 久久精品一区蜜桃臀影院| 精品国产乱码久久久久久久| 日韩欧美国产一区二区在线播放 | 欧美午夜精品久久久久久超碰| 99re成人在线| 色网站国产精品| 亚洲日本va午夜在线影院| 亚洲伊人色欲综合网| 国产精品久久久久久久岛一牛影视 | 99久久精品免费看国产| 高清不卡一区二区在线| 成人小视频免费在线观看| 国产麻豆一精品一av一免费 | 国产精品欧美精品| 国产精品久久久久影院色老大| 欧美激情在线免费观看| 欧美国产精品专区| 国产精品免费观看视频| **欧美大码日韩| 一区二区三区免费观看| 午夜精品福利在线| 日韩高清在线一区| 久久国产精品免费| 国产一本一道久久香蕉| 成人三级伦理片| 色综合久久综合网欧美综合网| 日本高清免费不卡视频| 欧美日韩一区二区三区在线| 正在播放一区二区| 欧美电影免费观看完整版| 久久久精品人体av艺术| 国产精品久久精品日日| 一区二区三区毛片| 午夜视频在线观看一区二区| 美腿丝袜亚洲一区| 国产精品18久久久久久久久| 91视频精品在这里| 5月丁香婷婷综合| 久久久亚洲精华液精华液精华液| 国产精品久久久久久亚洲毛片 | 欧美成人性战久久| 国产视频视频一区| 夜色激情一区二区| 麻豆精品视频在线观看| 成人性生交大片免费看中文| 91成人免费网站| 日韩美女主播在线视频一区二区三区| 国产亚洲精品资源在线26u| 日韩一区在线看| 日本成人在线视频网站| 国产91丝袜在线18| 欧美日韩三级一区二区| 久久久久久夜精品精品免费| 亚洲精品国产成人久久av盗摄 | 美女久久久精品| 成人综合婷婷国产精品久久蜜臀| 欧美少妇bbb| 欧美激情资源网| 午夜久久久久久| 懂色中文一区二区在线播放| 欧美日韩国产在线观看| 国产日韩av一区二区| 视频一区二区国产| 99精品久久久久久| 日韩精品一区二区三区中文精品| 亚洲美女屁股眼交| 国产一区二区三区不卡在线观看 | 亚洲一区二区四区蜜桃| 国产美女视频91| 欧美日韩电影在线播放| 中文字幕av在线一区二区三区| 视频一区在线播放| 99re热视频这里只精品 | 亚洲一级不卡视频| 懂色一区二区三区免费观看| 欧美一级日韩一级| 亚洲制服欧美中文字幕中文字幕| 国产精品69久久久久水密桃| 正在播放亚洲一区| 一区二区三区欧美在线观看| 丁香婷婷综合网| 精品少妇一区二区三区在线播放| 亚洲午夜精品一区二区三区他趣| 成人性生交大片免费| 精品国产凹凸成av人网站| 亚洲第四色夜色| 色哟哟国产精品| 国产精品传媒视频| 国产91精品欧美| xfplay精品久久| 另类专区欧美蜜桃臀第一页| 欧美乱熟臀69xxxxxx| 一区二区免费看| 94色蜜桃网一区二区三区| 亚洲国产精品ⅴa在线观看| 经典一区二区三区| 日韩免费高清视频| 毛片一区二区三区| 日韩一二在线观看| 免费高清不卡av| 91精品国产综合久久久久久漫画| 亚洲成a人片综合在线| 欧美日韩综合一区| 亚洲国产视频网站| 欧美日韩亚洲另类| 视频一区在线视频| 欧美一区二区黄色| 免费观看30秒视频久久| 欧美电影免费观看高清完整版 | 亚洲视频小说图片| 91麻豆国产在线观看| 国产精品妹子av| 成人性生交大片免费| 亚洲视频 欧洲视频| 一本色道综合亚洲| 午夜欧美在线一二页| 7777精品伊人久久久大香线蕉完整版| 天天影视涩香欲综合网| 91精品国产综合久久精品图片 | 99re6这里只有精品视频在线观看| 成人欧美一区二区三区在线播放| 一本色道亚洲精品aⅴ| 亚洲图片欧美综合| 欧美一二三区精品| 国产精品1024久久| 中文字幕在线免费不卡| 91久久免费观看| 日韩激情一二三区| 精品国精品国产| 国产99久久精品| 亚洲激情成人在线| 91麻豆精品91久久久久同性| 国产又黄又大久久| 日韩一区有码在线| 51精品视频一区二区三区| 精品亚洲国内自在自线福利| 亚洲国产岛国毛片在线| 在线观看不卡视频| 蜜桃一区二区三区在线| 欧美国产精品专区| 欧美性猛片aaaaaaa做受| 美日韩一区二区| 国产精品日韩精品欧美在线| 欧美在线你懂得| 国产在线精品一区二区不卡了| 一区二区中文视频| 欧美一区二区三区电影| 国产成人午夜99999| 亚洲午夜精品一区二区三区他趣| 久久美女艺术照精彩视频福利播放| 99re6这里只有精品视频在线观看| 无吗不卡中文字幕| 国产精品入口麻豆原神| 3d成人h动漫网站入口| 成人黄色在线网站| 日产精品久久久久久久性色| 国产精品人人做人人爽人人添| 欧美日韩国产高清一区二区三区| 国产成人日日夜夜| 日韩黄色一级片| 亚洲欧美日韩国产成人精品影院 | 亚洲123区在线观看| 国产视频不卡一区| 91精品国产欧美一区二区成人| 成人精品在线视频观看| 琪琪久久久久日韩精品| 亚洲视频 欧洲视频| 久久久久亚洲蜜桃| 在线播放/欧美激情| 99久久精品免费观看| 另类调教123区|