62,614
社区成员
发帖
与我相关
我的任务
分享
import java.util.*;
//稀疏矩阵算法。
//稀疏矩阵算法是为了在大型矩阵中非零元素少时,减少存贮空间,并提高矩阵运算速度的。
//但本例中的矩阵只是为了演示算法,都比较小,时间和空间效率提升可以忽略。
public class SparseMatrix{
public static void main(String[] args){
TripleSMatrix tsm=new TripleSMatrix(7,4);
//tsm.printTriple();
tsm.printMatrix();
TripleSMatrix tsm2=new TripleSMatrix(7,4);
System.out.println("矩阵a:");
tsm.printMatrix();
System.out.println("矩阵b:");
tsm2.printMatrix();
int[][] matrixSum=addSMatrix(tsm,tsm2);
System.out.println("矩阵a+矩阵b:");
for(int i=0;i<matrixSum.length;i++){
for(int j=0;j<matrixSum[i].length;j++){
System.out.print(" "+matrixSum[i][j]);
}
System.out.println("");
}
}
public static int[][] addSMatrix(TripleSMatrix t1,TripleSMatrix t2){ //计算两个三元组表示的矩阵之和,返回结束数组
if(t1.rows!=t2.rows||t1.columns!=t2.columns){
System.out.println("这两个矩阵不能相加");
return null;
}
int[][] c=new int[t1.rows][t2.columns];
int i=1,j=1;
while(i<=t1.nonzeroElements||j<=t2.nonzeroElements){
if(t1.triple[i][0]<t2.triple[j][0]&&i<=t1.nonzeroElements){
c[t1.triple[i][0]-1][t1.triple[i][1]-1]=t1.triple[i][2];
i++;
}else if(t2.triple[j][0]<t1.triple[i][0]&&j<=t2.nonzeroElements){
c[t2.triple[j][0]-1][t2.triple[j][1]-1]=t2.triple[j][2];
j++;
}else{
if(t1.triple[i][1]<t2.triple[j][1]&&i<=t1.nonzeroElements){
c[t1.triple[i][0]-1][t1.triple[i][1]-1]=t1.triple[i][2];
i++;
}else if(t1.triple[i][1]>t2.triple[j][1]&&j<=t2.nonzeroElements){
c[t2.triple[j][0]-1][t2.triple[j][1]-1]=t2.triple[j][2];
j++;
}else{
c[t1.triple[i][0]-1][t1.triple[i][1]-1]=t1.triple[i][2]+t2.triple[j][2];
i++;j++;
}
}
}
return c;
}
}
//下面的类定义不一定是最好的,比如其中的属性大多是包访问权限,可以改进。
class TripleSMatrix{ //定义了一个三元组的类。
int[][] triple=new int[2001][3]; //三元组数组,假设稀疏矩阵的值都是整数。最多可以有2000个非零元素。第零行没有用。
int rows,columns,nonzeroElements; //稀疏矩阵的行列数和非零元素个数。
TripleSMatrix(int rows,int columns){ //构造方法,rows是稀疏矩阵的行数,columns是稀疏矩阵的列数。
Scanner input=new Scanner(System.in);
System.out.println("请输入稀疏矩阵三元组");
System.out.println("以行 列 值的形式输入,如:1 2 4表示第1行第2列元素的值为4,当输入的行为999时结束:");
int count=1;
int i=0,j,v; //i行j列,值v
while(i!=999&&input.hasNext()){
i=input.nextInt();
j=input.nextInt();
v=input.nextInt();
if(i>rows||i<1||j>columns||j<1){
System.out.println("刚才的行,列值错,将被忽略");
continue;
}
triple[count][0]=i;
triple[count][1]=j;
triple[count][2]=v;
count++;
}
this.rows=rows;
this.columns=columns;
this.nonzeroElements=count-1;
sortTriple(triple,1,count); //对输入的三元组排序。
}
static void sortTriple(int[][] triple,int first,int end){ //对三元组排序方法,按行排,行一样按列排。
Arrays.sort(triple,first,end,new Comparator<int[]>(){
public int compare(int[] t1,int[] t2){
if(t1[0]>t2[0]) return 1;
if(t1[0]<t2[0]) return -1;
if(t1[0]==t2[0]) return t1[1]-t2[1];
return 0; //没有用的一个语句,但没有它编译通不过。
}
});
}
public void printMatrix(){ //打印出当前三元组表示的稀疏矩阵。
int row=1,column=1; //row当前要打印的行,column当前要打印的列。
for(int t=1;t<=nonzeroElements;t++){
while(triple[t][0]>row){ //三元组中的行比当前行大
if(column!=1){ //前面打印的行没有打印完,继续打印完
for(;column<=columns;column++) System.out.print(" "+0);
column=1; //新的一行列从1开始。
}else{ //当前行全为0
for(int i=1;i<=columns;i++){
System.out.print(" "+0);
}
}
System.out.println(""); //换行
row++; //下一行
}
for(;column<triple[t][1];column++){ //当前打印的列小于三元组中的列,前面要补零。
System.out.print(" "+0);
}
System.out.print(" ".substring(0,6-(String.valueOf(triple[t][2])).length())+triple[t][2]); //打印三元组对应的元素。
column++;
}
if(column!=1){ //前面打印的行没有打印完,继续打印完
for(;column<=columns;column++) System.out.print(" "+0);
System.out.println("");
column=1;
row++ ;
}
for(;row<=rows;row++){ //三元组中没有对应的值了,矩阵后面的元素全为0
for(column=1;column<=columns;column++){
System.out.print(" "+0);
}
System.out.println("");
}
}
public void printTriple(){ //打印三元组
for(int i=1;i<=nonzeroElements;i++){
for(int j=0;j<3;j++){
System.out.print(triple[i][j]+" ");
}
System.out.println("");
}
}
}
import java.util.*;
//稀疏矩阵算法。
//稀疏矩阵算法是为了在大型矩阵中非零元素少时,减少存贮空间,并提高矩阵运算速度的。
//但本例中的矩阵只是为了演示算法,都比较小,时间和空间效率提升可以忽略。
public class SparseMatrix{
public static void main(String[] args){
TripleSMatrix tsm=new TripleSMatrix(7,4);
//tsm.printTriple();
tsm.printMatrix();
TripleSMatrix tsm2=new TripleSMatrix(7,4);
System.out.println("矩阵a:");
tsm.printMatrix();
System.out.println("矩阵b:");
tsm2.printMatrix();
int[][] matrixSum=addSMatrix(tsm,tsm2);
System.out.println("矩阵a+矩阵b:");
for(int i=0;i<matrixSum.length;i++){
for(int j=0;j<matrixSum[i].length;j++){
System.out.print(" "+matrixSum[i][j]);
}
System.out.println("");
}
}
public static int[][] addSMatrix(TripleSMatrix t1,TripleSMatrix t2){ //计算两个三元组表示的矩阵之和,返回结束数组
if(t1.rows!=t2.rows||t1.columns!=t2.columns){
System.out.println("这两个矩阵不能相加");
return null;
}
int[][] c=new int[t1.rows][t2.columns];
int i=1,j=1;
while(i<=t1.nonzeroElements||j<=t2.nonzeroElements){
if(t1.triple[i][0]<t2.triple[j][0]&&i<=t1.nonzeroElements){
c[t1.triple[i][0]-1][t1.triple[i][1]-1]=t1.triple[i][2];
i++;
}else if(t2.triple[j][0]<t1.triple[i][0]&&j<=t2.nonzeroElements){
c[t2.triple[j][0]-1][t2.triple[j][1]-1]=t2.triple[j][2];
j++;
}else{
if(t1.triple[i][1]<t2.triple[j][1]&&i<=t1.nonzeroElements){
c[t1.triple[i][0]-1][t1.triple[i][1]-1]=t1.triple[i][2];
i++;
}else if(t1.triple[i][1]>t2.triple[j][1]&&j<=t2.nonzeroElements){
c[t2.triple[j][0]-1][t2.triple[j][1]-1]=t2.triple[j][2];
j++;
}else{
c[t1.triple[i][0]-1][t1.triple[i][1]-1]=t1.triple[i][2]+t2.triple[j][2];
i++;j++;
}
}
}
return c;
}
}
//下面的类定义不一定是最好的,比如其中的属性大多是包访问权限,可以改进。
class TripleSMatrix{ //定义了一个三元组的类。
int[][] triple=new int[2001][3]; //三元组数组,假设稀疏矩阵的值都是整数。最多可以有2000个非零元素。第零行没有用。
int rows,columns,nonzeroElements; //稀疏矩阵的行列数和非零元素个数。
TripleSMatrix(int rows,int columns){ //构造方法,rows是稀疏矩阵的行数,columns是稀疏矩阵的列数。
Scanner input=new Scanner(System.in);
System.out.println("请输入稀疏矩阵三元组");
System.out.println("以行 列 值的形式输入,如:1 2 4表示第1行第2列元素的值为4,当输入的行为999时结束:");
int count=1;
int i=0,j,v; //i行j列,值v
while(i!=999&&input.hasNext()){
i=input.nextInt();
j=input.nextInt();
v=input.nextInt();
if(i>rows||i<1||j>columns||j<1){
System.out.println("刚才的行,列值错,将被忽略");
continue;
}
triple[count][0]=i;
triple[count][1]=j;
triple[count][2]=v;
count++;
}
this.rows=rows;
this.columns=columns;
this.nonzeroElements=count-1;
sortTriple(triple,1,count); //对输入的三元组排序。
}
static void sortTriple(int[][] triple,int first,int end){ //对三元组排序方法,按行排,行一样按列排。
Arrays.sort(triple,first,end,new Comparator<int[]>(){
public int compare(int[] t1,int[] t2){
if(t1[0]>t2[0]) return 1;
if(t1[0]<t2[0]) return -1;
if(t1[0]==t2[0]) return t1[1]-t2[1];
return 0; //没有用的一个语句,但没有它编译通不过。
}
});
}
public void printMatrix(){ //打印出当前三元组表示的稀疏矩阵。
int row=1,column=1; //row当前要打印的行,column当前要打印的列。
for(int t=1;t<=nonzeroElements;t++){
while(triple[t][0]>row){ //三元组中的行比当前行大
if(column!=1){ //前面打印的行没有打印完,继续打印完
for(;column<=columns;column++) System.out.print(" "+0);
column=1; //新的一行列从1开始。
}else{ //当前行全为0
for(int i=1;i<=columns;i++){
System.out.print(" "+0);
}
}
System.out.println(""); //换行
row++; //下一行
}
for(;column<triple[t][1];column++){ //当前打印的列小于三元组中的列,前面要补零。
System.out.print(" "+0);
}
System.out.print(" ".substring(0,6-(String.valueOf(triple[t][2])).length())+triple[t][2]); //打印三元组对应的元素。
column++;
}
if(column!=1){ //前面打印的行没有打印完,继续打印完
for(;column<=columns;column++) System.out.print(" "+0);
System.out.println("");
column=1;
row++ ;
}
for(;row<=rows;row++){ //三元组中没有对应的值了,矩阵后面的元素全为0
for(column=1;column<=columns;column++){
System.out.print(" "+0);
}
System.out.println("");
}
}
public void printTriple(){ //打印三元组
for(int i=1;i<=nonzeroElements;i++){
for(int j=0;j<3;j++){
System.out.print(triple[i][j]+" ");
}
System.out.println("");
}
}
}
F:\>cd java
F:\java>java SparseMatrix
请输入稀疏矩阵三元组
以行 列 值的形式输入,如:1 2 4表示第1行第2列元素的值为4,当输入的行为999时结束:
5 2 22
4 1 40
7 4 -8
4 3 3
5 2 1
4 4 1
2 3 2
999 9 9
刚才的行,列值错,将被忽略
请输入稀疏矩阵三元组
以行 列 值的形式输入,如:1 2 4表示第1行第2列元素的值为4,当输入的行为999时结束:
2 2 33
1 2 20
3 4 -2
6 3 13
5 2 14
7 4 6
999 9 9
刚才的行,列值错,将被忽略
矩阵a:
0 0 0 0
0 0 2 0
0 0 0 0
40 0 3 1
0 22 1 0
0 0 0 0
0 0 0 -8
矩阵b:
0 20 0 0
0 33 0 0
0 0 0 -2
0 0 0 0
0 14 0 0
0 0 13 0
0 0 0 6
矩阵a+矩阵b:
0 20 0 0
0 33 2 0
0 0 0 -2
40 0 3 1
0 1 0 0
0 0 13 0
0 0 0 -2
F:\java>