C# WPF并行计算两个矩阵

2023-10-27

并行计算两个矩阵

要求:
编写一个WPF应用程序,利用数据并行计算两个矩阵(M×N和N×P)的乘积,得到一个M×P的矩阵。
(1)在代码中用多任务通过调用某方法实现矩阵并行运算,在调用的参数中分别传递M、N、P的大小。
(2)程序中至少要测试3次有代表性的不同大小的矩阵运算,并显示其并行运行用时。

1.初始化矩阵,用100以内的随机数填充

private double[,] Init(int row, int col)
        {
            double[,] data = new double[row, col];
            Random r = new Random();
            for(int i = 0; i < row; i++)
            {
                for(int j = 0; j < col; j++)
                {
                    data[i, j] = r.Next(100);
                }
            }
            return data;
        }

2.串行算法

private void Compute(double[,] a, double[,] b, double[,] result)
        {
            int aRows = a.GetLength(0);
            int aCols = a.GetLength(1);
            int bCols = b.GetLength(1);
            for(int i = 0;i < aRows; i++)
            {
                for (int j = 0; j < bCols; j++)
                {
                    double temp = 0;
                    for (int k = 0; k < aCols; k++)
                    {
                        temp += a[i, k] * b[k, j];
                    }
                    result[i, j] = temp;
                }
            }
            
        }

3.并行算法,仅将最外层换为Parallel.For

private void ParallelCompute(double[,] a, double[,] b, double[,] result)
        {
            int aRows = a.GetLength(0);
            int aCols = a.GetLength(1);
            int bCols = b.GetLength(1);
            Action<int> action = (i) =>
            {
                for (int j = 0; j < bCols; j++)
                {
                    double temp = 0;
                    for (int k = 0; k < aCols; k++)
                    {
                        temp += a[i, k] * b[k, j];
                    }
                    result[i, j] = temp;
                }
            };
            Parallel.For(0, aRows, action);
        }

4.定义时钟,并为防止运行时界面卡顿使用异步编程

Stopwatch stopwatch = new Stopwatch(); 
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void button_Click(object sender, RoutedEventArgs e)
        {
            textblock.Text = "";
            long[] t1 = await Task.Run(() => Multiply(325,18,66));
            textblock.Text = string.Format("测试1(矩阵1:325×18,矩阵2:18×66),非并行用时:{0}毫秒,并行用时:{1}毫秒", t1[0], t1[1]);
            long[] t2 = await Task.Run(() => Multiply(3250, 180, 660));
            textblock.Text += string.Format("\n测试2(矩阵2:3250×180,矩阵2:180×660),非并行用时:{0}毫秒,并行用时:{1}毫秒", t2[0], t2[1]);
            long[] t3 = await Task.Run(() => Multiply(32500, 200, 900));
            textblock.Text += string.Format("\n测试3(矩阵3:32500×200,矩阵2:200×900),非并行用时:{0}毫秒,并行用时:{1}毫秒", t3[0], t3[1]);
        }

5.初始化矩阵后计算,同时计时,结束后返回时钟数组

private long[] Multiply(int m, int n, int p)
        {
            long[] timeElapsed = new long[2];
            double[,] m1 = Init(m, n);
            double[,] m2 = Init(n, p);
            double[,] result = new double[m, p];
            //串行
            stopwatch.Restart();
            result = new double[m, p];
            Compute(m1, m2, result);
            stopwatch.Stop();
            timeElapsed[0] = stopwatch.ElapsedMilliseconds;

            //并行
            stopwatch.Restart();
            result = new double[m, p];
            ParallelCompute(m1, m2, result);
            stopwatch.Stop();
            timeElapsed[1] = stopwatch.ElapsedMilliseconds; 

            return timeElapsed;
        }

结果:
在这里插入图片描述
问题讨论:
1.结果只出现一行,没有用+=。输出未换行,字符串添加\n。
2.初始化时,System.IndexOutOfRangeException:“索引超出了数组界限。”原因:i,j出现写反的错误。
3.仅将最外层的for改为Parallel.For更优。
4.出现数过大,等待时间过久的问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# WPF并行计算两个矩阵 的相关文章

  • C++ 令人头疼的命名空间

    好吧 这个问题已经发生了一些变化 我想尝试从我正在追求的基本目标开始 重新 创建在 C 资源获取和初始化中包装遗留 C 语言实体的库代码 并提供基本或更好的异常保证 使此代码的客户端能够以非常自然的 C 方式使用它 而不会为现有代码创建大量
  • 如何为RenderTargetBitmap的输出设置透明度颜色?

    我正在尝试使用 RenderTargetBitmap 将具有透明背景的 Visual 对象保存到位图 public static RenderTargetBitmap RenderToBitmap this Visual Source in
  • 获取 WSA 错误代码的格式化消息

    我在 win32 C 应用程序中使用winsock2 我将使用 MessageBox 显示可以通过调用 WSAGetLastError 检索的网络错误 我怎样才能做到这一点 我看到 FormatMessage 但我不明白如何使用它 例如 以
  • Microsoft Graph API 授权错误:无效受众

    我知道这是一个很长的问题 但如果有人能与我分享他们的想法或经验 我真的很感激 因为我已经解决这个问题几天了 现在正在尝试很多事情 我有一个 ASP Net Core 3 1 Web API 应用程序和一个 ASP NET Core 3 1
  • 是否有一种快速替代方法可以从 XNA 中的位图对象创建 Texture2D?

    我环顾四周 发现从位图创建Texture2D的唯一方法是 using MemoryStream s new MemoryStream bmp Save s System Drawing Imaging ImageFormat Png s S
  • 为什么 C++11/Boost `unordered_map` 在擦除时不重新散列?

    我想知道为什么 C 11 和 Boost 的 hashmap 在通过迭代擦除元素时不会调整大小 即使这在技术上不是内存泄漏 我认为这可能是应用程序中的一个严重问题 这对我来说是一个隐藏的问题 很难追踪它 并且它实际上可能会影响许多应用程序
  • JObject ToString 与 StringEnumConverter 不起作用

    我正在尝试序列化一个匿名类 如下所示 public enum ErrorCode A B C var response JObject FromObject new Error new Message Test Code ErrorCode
  • 如何设置属性选择器的值 Expression>

    我需要使用模式工厂的想法将 Person 类实体中的实体属性 Address 与 FactoryEntities 类中的表达式 linq 相关联 看看这就是我所拥有的并且我想要做的 Address address new Address a
  • 在 C++ 中重用异常处理代码

    我有这两个函数 具有重复的异常处理 其唯一目的是显示错误消息 void func1 noexcept try do task do another task catch const std out of range e show msg O
  • C# 中的异步方法如何工作?

    我在我的一些项目中使用异步方法 我喜欢它 因为它使我的应用程序更具可扩展性 但是 我想知道异步方法如何在后台真正工作 NET 或 Windows 如何知道调用已完成 根据我进行的异步调用的数量 我可以看到创建了新线程 但并不总是 为什么 此
  • 委托:方法名称预期错误

    我正在尝试让以下简单的委托示例正常工作 根据我从中取出的一本书 应该没问题 但我得到了Method name expected error namespace TestConsoleApp class Program private del
  • 实体框架..自引用表..获取深度=x的记录?

    我成功地在实体框架中使用自引用表 但我不知道如何获得所需深度的记录 这应该是什么逻辑 Model public class FamilyLabel public FamilyLabel this Children new Collectio
  • 如何在 .NET 6.0 中使用最小 Api 配置 Newtonsoft Json

    I have net6 0具有最少 api 的项目 我想使用NetwtonsoftJson而不是内置的System Text Json用于序列化和反序列化的库 目前我有这个配置JsonOptions并且按预期工作 builder Servi
  • 如何使用 GCC 在 C 上编译库?

    我用这些文件创建了一个库pila h and pila c 我编译文件pila c with gcc pila c c这个库运行良好 我已经测试过了 然后我又做了一个图书馆 这个库有文件pila funciones extra h and
  • C# 中的自定义按钮:如何删除悬停背景?

    我正在尝试使用 Visual Studio 2005 对我的表单 其 FormBorderStyle none 执行自定义按钮 我在链接到该按钮的 ImageList 中有我的 3 种状态按钮图像 this btnClose AutoSiz
  • 初学者友好的方法来获取所有文件和目录的列表

    使用 NET 3 0 我得到了下面的方法 它可以正确返回指定目录的所有文件和目录 以及子目录 的集合 如果可能的话 我想将其简化为仅使用我非常熟悉的结构 具体来说 有以下几点我不太清楚 1 IEnumerable
  • 使用全局 Web API 过滤器属性进行 Unity 依赖注入

    参考这个CodePlex 统一文章 http unity codeplex com discussions 446780我能够使用 WebAPI 控制器获取过滤器属性 如下所示 MyFilterAttribute public class
  • OpenMP 动态调度与引导调度

    我正在研究 OpenMP 的调度 特别是不同的类型 我了解每种类型的一般行为 但澄清一下何时进行选择会很有帮助dynamic and guided调度 英特尔的文档 https software intel com en us articl
  • 对 MFC UI 应用程序进行单元测试吗?

    如何对大型 MFC UI 应用程序进行单元测试 我们有一些大型 MFC 应用程序已经开发了很多年 我们使用一些标准的自动化 QA 工具来运行基本脚本来检查基础知识 文件打开等 这些由 QA 小组在日常构建后运行 但我们希望引入一些程序 以便
  • 在.Net中使用ObjectCache缓存对象并设置过期时间

    我陷入了一个场景 我的代码如下 更新 它不是关于如何使用数据缓存 我已经在使用它及其工作 它是关于扩展它 以便该方法在到期时间和从外部源获取新数据之间不会进行调用 object string this GetDataFromCache ca

随机推荐

  • nginx反向代理后获取真实请求ip

    本来接口运行的好好的 后面为了规范接口 我在nginx加了如下代码 location v1 api proxy pass https xxx xxx xxx 8081 v1 api 后面重新部署后发现通过HttpServletRequest
  • python下载安装使用_下载、安装与使用 pysot

    本篇文章简要介绍了如何在windows环境下 使用anaconda进行pysot运行环境的部署以及使用 pysot是商汤科技推出的一个针对单目标跟踪 Single Object Tracking 的 研究平台 里面包含了他们团队的一些算法实
  • 23种设计模式之策略模式

    文章目录 概览 策略模式的优缺点 策略模式的应用场景 策略模式的结构与实现 模式的结构 模式的实现 策略模式的扩展 总结 概览 策略模式定义了一系列算法 并将每个算法封装起来 使他们可以相互替换 且算法的变化不会影响到使用算法的客户 需要设
  • Python从入门到放弃(三):基本语句和语法

    一 一些改变 1 Python增加了什么 相比起C 或者其他一些语言 Python增加了一个冒号 所有的python复合语句 都是首行由冒号来提醒 这个一定不能够掉了 且接下来是以缩进的形式来书写 C 或者一些语言是大括号括起来的 后面会看
  • 【算法与数据结构】98、LeetCode验证二叉搜索树

    文章目录 一 题目 二 解法 三 完整代码 所有的LeetCode题解索引 可以看这篇文章 算法和数据结构 LeetCode题解 一 题目 二 解法 思路分析 注意不要落入下面你的陷阱 笔者本来想左节点键值 lt 中间节点键值 lt 右节点
  • 传感器i2c与arduino连接_Arduino中进行I2C通信发送数据案例分析

    在之前的文章中 我们介绍了Arduino之间的SPI通信 今天我们将学习另一种串行通信协议 I2C 内部集成电路 比较I2C和SPI I2C只有两条线 而SPI使用四条 I2C可以有多个主机和从机 而SPI只能有一个主机和多个从机 因此 如
  • docker容器连接宿主机redis和mysql

    当我们在用docker部署项目的时候可能会遇到这样一个问题 项目A和项目B都用到了redis和mysql 如果在docker compose里link或者dependon一个redis和mysql的话 会发现每一个项目都有一个redis和m
  • static作用:静态变量的生存周期和作用域

    首先要理解生存周期与作用域的区别 生存周期 变量从定义到销毁的时间范围 存放在全局数据区的变量的生存周期存在于整个程序运行期间 而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁 除了静态变量之外的局部变量都存放于栈中 作用域 变量的
  • 多路开关模式的switch语句

    在实例10中 将break语句去掉之后 会将符合检验条件后的所有语句都输出 利用这个特点 可以设计多路开关模式的switch语句 例如 在平年一年12个月 1 3 5 7 8 10 12月是31天 4 6 9 11月是30天 2月是28天
  • 第1144期AI100_机器学习日报(2017-11-05)

    AI100 机器学习日报 2017 11 05 聊天机器人Chatbot知识资料全集 入门 进阶 论文 软件 数据 专家等 wx 专知内容组 推荐中的序列化建模 Session based neural recommendation wx
  • Echarts饼状legend如何自动显示值和百分比

    效果图如下 重点在legend里如何设置 显示值和百分比 div class div block strong class block box title 硬盘使用情况 总容量 total strong div div div
  • 如何写出好的接口测试用例?一文1500字从0到1教你写一个合格的接口测试用例

    作为测试人 我们经常要对项目中的接口进行接口测试 那么在做接口测试的时候 如何写接口测试用例呢 如何写出好的接口测试用例呢 什么是接口测试 首先我们要了解一下 什么是接口测试 那么首先要搞清楚 我们一般说的接口到底是什么 一般狭义上说的都是
  • Linux查看二进制文件

    方法一 使用hexedit 下载 sudo apt get install hexedit 然后使用hexedit命令就行了 方法二 使用vim 先用vim b file打开文件 然后输入 xxd命令转换为十六进制 输入 xxd r返回原显
  • IntelliJ IDEA:删除当前一整行

    参考 https blog csdn net weixin 40836179 article details 81360342
  • 从 Spec.到芯片_(数字IC、模拟IC、FPGA/CPLD设计的流程及EDA工具)

    从 Spec 到芯片 先来看张图 本图体现出了集成电路产业链 设计业 制造业 封测业 关于制造 封装测试我们看两张图稍作了解即可 关于设计 是本文主要内容 主要从下方几个方面了解 1 IC设计大致分类 2 IC设计需要考虑的因素 3 数字I
  • 01LinuxC线程学习之线程概念,简述与进程区别和查看LWP轻量级线程号(不是PID也不是TID))

    1 线程 1 1 线程概念 1 线程概念 每个线程有各自的PCB 但没有独立的地址空间 共享 注 该地址空间指的是以进程为单位 不是指栈 而进程拥有独立地址空间 拥有PCB 2 LWP light weight process 轻量级的进程
  • 【华为OD机试真题2023B卷 JAVA&JS】IPv4地址转换成整数

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 IPv4地址转换成整数 时间限制 1秒 内存限制 262144K 语言限制 不限 题目描述 存在一种虚拟IPv4地址 由4小节组成 每节的范围为0 255 以 号间隔 虚拟IPv4地址
  • Midjourney如何集成到自己(个人/企业)的平台(一)

    背景概述 目前Midjourney没有对外开放Api 想体验他们的服务只能在discord中进入他们的频道进行体验或者把他们的机器人拉入自己创建的服务器中 目前免费的已经无法体验了 需要使用就订阅 在网上搜索相应资料也是一知半解的 没有能照
  • tomcat 线程池和连接池

    在介绍如何配置tomcat线程池和连接池之前 先介绍一下线程池和连接池的原理 线程池的原理 其实线程池的原理很简单 类似于操作系统中的缓冲区的概念 它的流程如下 先启动若干数量的线程 并让这些线程都处于睡眠状态 当客户端有一个新请求时 就会
  • C# WPF并行计算两个矩阵

    并行计算两个矩阵 要求 编写一个WPF应用程序 利用数据并行计算两个矩阵 M N和N P 的乘积 得到一个M P的矩阵 1 在代码中用多任务通过调用某方法实现矩阵并行运算 在调用的参数中分别传递M N P的大小 2 程序中至少要测试3次有代