矩阵按列相乘运算的并行化实现方法

2024-04-25 10:04

本文主要是介绍矩阵按列相乘运算的并行化实现方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        这两天一直在琢磨如下矩阵计算问题。

        已知d×m矩阵X和h×q矩阵Y,求如下矩阵:

其中X(:,i), Y(:,j)分别表示矩阵X, Y的第i列和第j列,易知Z为d×h矩阵。

        如果直接串行计算矩阵Z,两个循环共有m×q,则会很慢,能不能并行化呢?

        实际上是可以的,为便于理解,我们先把Z写成如下形式:

对于矩阵Z中的第(r,s)个元素:

.

注意到第一个括号是X的第r行之和,第二个括号是Y的第s行之和。

        也就是说,矩阵Z中的第(r,s)个元素等于X的第r行之和乘以Y的第s行之和。因此,可以先分别将X和Y所有列对应相加,得到长为d的列向量Xsum和长为h的列向量Ysum,则Z等于Xsum乘以Ysum的转置。实际上,推导可以不用这么麻烦,对于目标计算式:

 

注意到第一个括号是将X所有列对应相加,第二个括号是将Y所有列对应相加,因此Z也就是前面提到的Xsum乘以Ysum的转置。

        Matlab代码如下:

function [ Z ] = Mtx_Col_Multi( X, Y )
% Mtx_Col_Multi returns Z = \sum_{i=1}^{m}\sum_{j=1}^{q} X(:,i)*Y(:,j)'
% Here, X(:,i) and Y(:,j) denote the i-th and j-th column of X and Y, respectively
% INPUT:
% X     - A dxm matrix
% Y     - A hxq matrix
% OUTPUT:
% Z     - A dxh matrixX_sum = sum(X,2);Y_sum = sum(Y,2);Z = X_sum*Y_sum';%dxh%     %This function implements the following procedure in parallel
%     Z = zeros(d,h);%dxh
%     for ii=1:m
%         x_i = X(:,ii);
%         for jj=1:q
%             y_j = Y(:,jj)';
%             Z = Z + x_i*y_j;
%         end
%     end    
end

        其实我真正想计算的是如下运算,里面包含一个系数:

其中C(i,j)是一个系数,是矩阵C中的第(i,j)个元素。那么这个运算能不能并行化呢?

        使用类似的思想:

 因此,可以编写如下函数:

function [ Z ] = Mtx_Coef_Col_Multi( X, Y, C )
% Mtx_Coef_Col_Multi returns Z = \sum_{i=1}^{m}\sum_{j=1}^{q} C(i,j)*X(:,i)*Y(:,j)'
% Here, X(:,i) and Y(:,j) denote the i-th and j-th column of X and Y, respectively
% C(i,j) denotes the item in i-th row and j-th column of C.
% INPUT:
% X     - A dxm matrix
% Y     - A hxq matrix
% C     - A mxq matrix
% OUTPUT:
% Z     - A dxh matrixd = size(X,1);h = size(Y,1);[m,q] = size(C);if q<mZ = zeros(d,h);%dxhfor jj=1:qy_j = Y(:,jj)';%1xhc_j = C(:,jj)';%1xmX_c = bsxfun(@times, X, c_j);%dxmX_sum = sum(X_c,2);%dx1Z = Z + X_sum*y_j;%dxhend       elseZ = zeros(d,h);%dxhfor ii=1:mx_i = X(:,ii);%dx1c_i = C(ii,:);%1xqY_c = bsxfun(@times, Y, c_i);%hxqY_sum = sum(Y_c,2);%hx1Z = Z + x_i*Y_sum';%dxhend end%     %This function implements the following procedure in parallel
%     Z = zeros(d,h);%dxh
%     for ii=1:m
%         x_i = X(:,ii);
%         for jj=1:q
%             y_j = Y(:,jj)';
%             Z = Z + C(ii,jj)*x_i*y_j;
%         end
%     end
end

可以使用如下代码测试一下上述并行化实现方法与串行实现的效率差异:

%demo for Mtx_Coef_Col_Multi
clc;clear;close;
d = 5;
m = 10000;
h = 8;
q = 50;
X = rand(d,m);
Y = rand(h,q);
C = rand(m,q);tic;
Z_serial = zeros(d,h);%dxh
for ii=1:mx_i = X(:,ii);for jj=1:qy_j = Y(:,jj)';Z_serial = Z_serial + C(ii,jj)*x_i*y_j;end
end
toc;
tic;
Z = Mtx_Coef_Col_Multi(X, Y, C);
toc;
norm(Z_serial-Z,'fro')

命令行窗口输出如下信息(有一定的随机性,每次运行结果有些差异):

时间已过 1.011418 秒。

时间已过 0.009981 秒。

ans =

   6.5505e-09

也就是在当前设置下,并行实现版本的效率提交了100倍左右。

这篇关于矩阵按列相乘运算的并行化实现方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934368

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也