低价网站制作顺德,php网站开发教程网,建设公司网站入账,学校网站建设好么这两天一直在琢磨如下矩阵计算问题。 已知dm矩阵X和hq矩阵Y#xff0c;求如下矩阵#xff1a; 其中X(:,i), Y(:,j)分别表示矩阵X, Y的第i列和第j列#xff0c;易知Z为dh矩阵。 如果直接串行计算矩阵Z#xff0c;两个循环共有mq#xff0c;则会很慢#xff0c;能不能并行化… 这两天一直在琢磨如下矩阵计算问题。 已知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_{i1}^{m}\sum_{j1}^{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 ii1:m
% x_i X(:,ii);
% for jj1: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_{i1}^{m}\sum_{j1}^{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 qmZ zeros(d,h);%dxhfor jj1: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 ii1: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 ii1:m
% x_i X(:,ii);
% for jj1: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 ii1:mx_i X(:,ii);for jj1: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倍左右。