矩阵并行计算练习(C#)

前台界面:

运行结果:

后台代码:

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            button.Click += Begin;
        }
        
        /**
         *点击事件
         */
        private void Begin(object sender, RoutedEventArgs e)
        {
            //int count = 3;//计数器 表示要计算三次矩形矩阵相乘

            //声明数组并提前写入相应测试的值
            int[] M = { 200, 1000, 2500 };
            int[] N = { 18, 180, 200 };
            int[] P = { 20, 200, 300 };
            Action<int> action = i =>
            {
                Task.Run(() => Compute(M[i], N[i], P[i]));//多任务
            };
            Parallel.For(0, 3, action);

            /*
            
              for (int i = 0; i < count; i++)
             {
                 int m = M[i];
                 int n = N[i];
                 int p = P[i];          
                 Task.Run(() => Compute(m,n,p));//多任务

             }*/


        }
        //,int n,int p

        /**
         *计算两个矩阵相乘的具体方法
         */

        public void Compute(int m,int n,int p)
        {

            DateTime timeBegin = DateTime.Now;//记录开始时间
            int[,] first = new int[m, n];//声明相应的二维数组
            int[,] second = new int[n, p];//声明相应的二维数组
            int[,] result = new int[m, p];//声明一个m行p列的二维数组

            //两个for循环生成一个m行n列的矩阵,用数组保存
            for (int i=0;i<m;i++)
            {
                for(int j=0;j<n;j++)
                {
                    first[i, j] = (i + 1) * (j + 1);
                }
            }

            //两个for循环生成一个n行p列的矩阵,用数组保存
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < p; j++)
                {
                    second[i, j] = (i + 1) * (j + 1);
                }
            }

            for(int first_h=0; first_h < m; first_h++)//代表的是第一个数组的行
            {
                int[] firstH = new int[n];//用来记录第一个数组的一行数据
                int[] secondL = new int[n];//用来记录第二个数组的一列数据
                for (int first_l = 0; first_l < n; first_l++)//代表的是第一个数组的列
                    firstH[first_l] = first[first_h,first_l];//获取第一个数组的第first_h行
               
                for(int second_l=0;second_l<p;second_l++)//代表的是第二个数组的列
                {
                    int total = 0;//用来
                    for (int second_h=0;second_h<n;second_h++)
                         secondL[second_h] = second[second_h, second_l];//获取第二个数组的第second_l列                                                         
                
                    for(int i=0;i<firstH.Length;i++)//这里也可以改成i<secondL.length
                    {
                        int temp = firstH[i] * secondL[i];
                        total += temp;
                    }
                    result[first_h, second_l] = total;//将取得的结果放在数组中
                }//end scond_l
                    
            }//end first_h
            DateTime timeEnd = DateTime.Now;//记录结束时间
            TimeSpan timeSpan = timeEnd - timeBegin;//记录时间间隔
            listBox.Dispatcher.Invoke(() =>  listBox.Items.Add("矩阵1:" + m + "x" + n + "  矩阵2:" + n + "x" + p + " 用时;" + timeSpan.Milliseconds + "毫秒"));//这里用到了调度器和lambda表达式

        }//end compute()


    }//end class

  • 10
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值