编写一个Matrix 库并实现以下API:
public class Matrix
static double dot(double[] x, double[] y) 向量点乘
static double[][] mult(double[][] a, double[][] b) 矩阵和矩阵之积
static double[][] transpose(double[][] a) 转置矩阵
static double[] mult(double[][] a, double[] x) 矩阵和向量之积
static double[] mult(double[] y, double[][] a) 向量和矩阵之积
编写一个测试用例,从标准输入读取矩阵并测试所有方法。
1.首先下载两个jar库:stdlib.jar和algs4.jar包
点击下载
2.将这两个包导入自己的Eclipse中:
步骤如下:
1、右键点击你需要添加jar包的项目。
2、选择“Properties”。
3、然后选择对话框中的“Java Build Path”。
4、选择“Libraries”选项卡,然后点击右边的“Add External JARS“,然后找到你的jar所存放的路径,选择需要添加的jar包。
5、点击“OK”完成。
经过以上步骤即可添加好jar包。
注意:如果是添加系统所带有的jar,在第4步的时候选择“Add JARS”,其他步骤相同。
进入正题:
直接上代码吧!
public class Matrix {
public Matrix() {
// TODO Auto-generated constructor stub
}
public static double dot(double[] x, double[] y)//向量点乘
{
double a=0;
if(x.length!=y.length)
{ return a; }//此处抛出异常
for(int i=0;i<x.length;i++)
a+=x[i]*y[i];
return a;
}
public static double[][] transpose(double[][] a)// 转置矩阵
{
for (int i=0;i<a.length;i++)
{
for(int j=i;j<a[0].length;j++)
{
double temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
}
return a;
}
/*
* 矩阵的乘积定义:一个n行m列的矩阵乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,
* 其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应
* 相乘后所有m个乘积的和。
* */
static double[][] mult(double[][] a, double[][] b)// 矩阵和矩阵之积
{
int M=a[0].length;
int N=a.length;
int P=b[0].length;
double[][] c=new double[M][P];
if(M!=b.length)
{}//此处抛出异常
for(int i=0;i<N;i++)
for(int j=0;j<P;j++)
{for(int m=0;m<M;m++)
c[i][j]+=a[i][m]*b[m][j];
}
return c;
}
public static double[] mult(double[][] a, double[] x)//矩阵和向量之积
{
int N=a.length;
double[] c=new double[N];
int M=a[0].length;
if(M!=x.length)
{}//此处抛出异常
for(int i=0;i<N;i++)
{for(int m=0;m<M;m++)
c[i]+=a[i][m]*x[m];
}
return c;
}
public static double[] mult(double[] y, double[][] a) //向量和矩阵之积
{
int N=y.length;
double[] c=new double[N];
int M=y.length;
if(M!=a[0].length)
{}//此处抛出异常
for(int i=0;i<N;i++)
{for(int m=0;m<M;m++)
c[i]+=a[i][m]*y[i];
}
return c;
}
public static void Print(double [][] a , String name)
{
StdOut.println(name+":");
for (int i=0;i<a.length;i++)
{
for(int j=0;j<a[0].length;j++)
{
StdOut.print(a[i][j]+" ");
}
StdOut.println();
}
StdOut.println();
}
public static void Print(double [][] a )
{
for (int i=0;i<a.length;i++)
{
for(int j=0;j<a[0].length;j++)
{
StdOut.print(a[i][j]+" ");
}
StdOut.println();
}
StdOut.println();
}
public static void Print(double [] a , String name)
{
StdOut.println(name+":");
for (int i=0;i<a.length;i++)
{
StdOut.print(a[i]+" ");
if((i+1)%10==0)
StdOut.println();
}
StdOut.println();
}
public static void Print(double [] a )
{
for (int i=0;i<a.length;i++)
{
StdOut.print(a[i]+" ");
if((i+1)%10==0)
StdOut.println();
}
StdOut.println();
}
public static double[][] randominti(double[][] a)
{
int N=a.length;
int M=a[0].length;
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
a[i][j]=StdRandom.uniform(N+M);
}
}
return a;
}
public static double[] randominti(double[] a)
{
int N=a.length;
for(int i=0;i<N;i++)
{
a[i]=StdRandom.uniform(N);
}
return a;
}
//测试用例
public static void main(String[] args) {
// TODO Auto-generated method stub
int N=5;
int p=10;
double[][] a=new double[N][N];
double[][] b =new double[p][N];
double[] c=new double[N];
double d =0;
a=randominti(a);
b=randominti(b);
c=randominti(c);
d=dot(c,c);
Print(c,"c");
StdOut.print("dot(c,c):d="+d);
Print(a,"a");
Print(b,"b");
double[][] x=new double[a[0].length][a.length];
x= transpose(a);
Print(x,"transpose(a)to x");
x=mult(a,b);
Print(x,"mult(a,b)");
double[] y=c;
y=mult(a,c);
Print(y,"mult(a,c)");
y=mult(c,a);
Print(y,"mult(c,a)");
}
}