矩阵乘法

来源:互联网 发布:python 每秒执行一次 编辑:程序博客网 时间:2024/04/27 22:10
 老师布置的作业,已经上交了,贴出来,说不定能帮上忙

题目:就是用户输入A,输入二维关系R,得出关系矩阵

里面涉及一个矩阵的任意次连乘,很有用

using System;
namespace 考试
{
    
/// <summary>
    
/// 考试题,求R的N次幂
    
/// </summary>

    class test
    
{
        [STAThread]
        
static void Main(string[] args)
        
{
            
//A是全集
            string[] A;
            
//R是二元关系
            string[,] R;
            
string[] strR;
            
//strM是字符矩阵,M是数字矩阵
            int[,] M;
            
int[,] MS;
            
int[,] MD;
            
string[,] strM;
            
//M1是临时矩阵
            string[,] M1;
            
//M2是临时矩阵
            string[,] M2;
            
int b;
            
//power是幂的次数
            int power;
            Console.WriteLine(
"请输入A的大小:");
            
//得到A的大小
            A=new string[int.Parse(Console.ReadLine())];
            
//得到M,M1,M2的大小
            M=new int[A.Length,A.Length];
            MS
=new int[A.Length,A.Length];
            MD
=new int[A.Length,A.Length];
            strM
=new string[A.Length,A.Length];
            M1
=new string[A.Length,A.Length];
            M2
=new string[A.Length,A.Length];
            
//得到A的值
            for(int i=0;i<A.Length;i++)
            
{
                Console.WriteLine(
"请输入第"+(i+1)+"个元素:");
                A[i]
=Console.ReadLine();
            }

            Console.WriteLine(
"请输入R中元素的个数(单位:组)");
            
//得到R的行数    
            b=int.Parse(Console.ReadLine());
            R
=new string[b,2];
            strR
=new string[b];
            
//得到R的值
            for(int i=0;i<b;i++)
            
{
                
for(int j=0;j<2;j++)
                
{
                    Console.WriteLine(
"请输入第"+(i+1)+"组第"+(j+1)+"");
                    R[i,j]
=Console.ReadLine();
                }

            }

            
//得到幂的次数
            Console.WriteLine("请输入你要计算的幂的次数:");
            power
=int.Parse(Console.ReadLine());
            
//得到A×A的矩阵
            for(int i=0;i<A.Length;i++)
            
{
                
for(int j=0;j<A.Length;j++)
                
{
                    M1[i,j]
=A[i];
                }

            }

            
for(int i=0;i<A.Length;i++)
            
{
                
for(int j=0;j<A.Length;j++)
                
{
                    M2[i,j]
=A[j];
                }

            }

            
//合并m1,m2
            for(int i=0;i<A.Length;i++)
            
{
                
for(int j=0;j<A.Length;j++)
                
{
                    strM[i,j]
=M1[i,j]+M2[i,j]+"";
                }

            }

            
//合并r
            for(int i=0;i<b;i++)
            
{
                 strR[i]
=R[i,0]+R[i,1];    
            }

            
//得到M的值
            
            
for(int i=0;i<A.Length;i++)
            
{
                
for(int j=0;j<A.Length;j++)
                
{
                    
foreach(string s in strR)
                    
{
                        
if(s.Equals(strM[i,j]))
                        
{
                            M[i,j]
=1;
                        }

                    }

                }

            }

            
//copy一份M的值,为以后求乘法的时候做准备
            for(int i=0;i<A.Length;i++)
            
{
                
for(int j=0;j<A.Length;j++)
                
{
                    MS[i,j]
=M[i,j];
                }

            }



            
//h求累加值
            int h;
            
//当求一次幂的时候
            if(power==1)
            
{
                
for(int i=0;i<A.Length;i++)
                
{
                    
for(int j=0;j<A.Length;j++)
                    
{
                        Console.Write(M[i,j]
+" ");
                    }

                    Console.WriteLine();
                }

            }

            
//求多次幂的时候
            else
            
{
                
//w控制幂的次数
                for(int w=1;w<power;w++)
                
{
                    
                    
                    
//i控制行
                    for(int i=0;i<A.Length;i++)
                    
{
                        
//j控制列
                        for(int j=0;j<A.Length;j++)
                        
{
                            h
=0;
                            
//k用来控制列的移动
                            for(int k=0;k<A.Length;k++)
                            
{
                                h
+=MS[i,k]*M[k,j];
                            }

                            MD[i,j]
=h;
                        }

                    }

                    
//改变下一次循环时MS的值,与递归类似.
                    for(int i=0;i<A.Length;i++)
                    
{
                        
for(int j=0;j<A.Length;j++)
                        
{
                            MS[i,j]
=MD[i,j];
                        }

                    }

                }

            }

            
//输出
            Console.WriteLine("结果为:");
            
for(int i=0;i<A.Length;i++)
            
{
                
for(int j=0;j<A.Length;j++)
                
{
                    Console.Write(MD[i,j]
+" ");
                }

                Console.WriteLine();
            }

            Console.ReadLine();
        }

    }

}

原创粉丝点击