罗兰关于MATLAB的艺术

将想法转化为matlab

分页的矩阵函数

今天的客座博主是Mary Fenelon,她是MathWorks的优化和数学产品营销经理。在今天的帖子中,她描述了如何使用新的页面矩阵函数来简化代码并提高性能。
一个批量的、按页面排列的矩阵乘法函数pagemtips.,以及页面明智的转发PageTranspose.,复共轭转置pagectranspose函数,在R2020b中加入MATLAB®。新函数使N-D数组作为密集矩阵容器的操作更容易编写和更快地运行。
例如,如果a和b是3-d阵列,并且您希望将阵列c计算为通过将包含在A和B的前两个维度中包含的矩阵乘以矩阵而形成的矩阵的集合,您可以使用该语句执行此操作c = pagemtimes(a,b)。
除了for循环之外的其他方法pagemtips.dlmtimesdlarray在深度学习工具箱和pagefunGPUArray.和并行计算工具箱中的分布式数组。这些仍然可用,但现在您可以使用页面时间为常规数组以及dlarrayGPUArray.
有时你只需要转置一组矩阵。现在你可以用PageTranspose.而不是换乘

更轻松

在该示例中,要乘以的矩阵存储在4-D阵列的前两个维度中
A =兰特(4,5,6,7);
B =兰特(2,5,6,7);
这个双重嵌套的for循环计算矩阵与矩阵的乘积。下载188bet金宝搏
C1 = 0(大小(A, 1),大小(B, 1), 6、7);
p = 1:尺寸(a,3)
q = 1:尺寸(4)
C1(:,:,p,q)= a(:,p,q)* b(:,:,p,q)。';
结束
结束
使用pagemtips.,可以将该代码简化为单个函数调用:
c2 = pagemtimes(a,“没有”B'转倒');
这当然更容易。字符串选项指定在乘法中应使用第二个数组的按页转置。pagemtips.隐含地扩展三个超出三个以乘以分页矩阵的所有组合。

快点

既然我已经证明了更简单的方法,那么更快的方法呢?加速是否随N-D数组的大小而变化?下面的循环遍历一组矩阵,其中第一个矩阵的行大小不同,但维数是固定的。我把时间和加速速度画出来。
rng (“默认”);%的再现性
n = 100;
k = 2;
p = 10000;
mset = 10:10:100;
mSize =元素个数(mset);
tloop = zeros(msize,1);
tPage = 0 (mSize, 1);
i = 1:numel(mset)
m = mset(我);
一个=兰德(m, n, p);
b = rand(n,k);
CPAGE = Pagemtimes(A,B);
f = @ () pagemtimes (A, B);
tPage时间(我)= (f);
cloop = loopmtiemes(a,b,m,k,p);
f = @()loopmtiemes(a,b,m,k,p);
Tloop(i)= timeit(f);
结束
绘图(MSET,N,P,K,TPAGE,TLOOP);
时代绘图表明for-loop需要更多时间pagemtips..加速图显示了使用的好处pagemtips.当有许多小矩阵但即使对于较大的值也是最大的,速度仍然很大。较小矩阵的改进更为显着,因为被消除的开销构成了整个时间的更大百分比。
我喜欢用时代而不是抽搐/toc有关时间(参见a以前的文章时代),尽管它需要将需要计时的代码放入函数中。时代多次运行代码并获取中值度量值。这是推荐的方法衡量代码的性能.即便如此,对于运行时间非常短的代码,比如当矩阵大小很小时,时代将难以返回准确的时间。在这种情况下,建议在循环中多次运行代码。
如果你尝试用不同的值来表示A和B的维度,你会看到不同的加速。例如,当数组很大且只有几页时,由于大部分工作都在实际的矩阵乘法中,所以不会有太多的内容。由于测量小矩阵的时间和缓存和线程处理大矩阵的影响的困难,您可能还会看到一些不规则性。

更多的

可以为其他矩阵函数编写分页函数。我们应该首先做哪些操作,在哪些应用程序中将使用它们?让我们知道这里

辅助功能

功能cloop = loopmtiemes(a,b,m,k,p)
Cloop = Zeros(M,K,P);
我= 1:p
cloop(:,:,i)= a(:,i)* b;
结束
结束
功能赌注(mset,n,p,k,tpage,tloop)
图('位置', 100100, 1200, 450)
t = tiledlayout(1,2);
nexttile
绘图(MSET,TPAGE,'*');
持有
绘图(mset,tloop,“o”);
传奇({“pagemtimes”“循环”},'地点''西北');
标题(“次”
Xlabel('M'
ylabel(“秒”
持有
nexttile
绘图(mset,tloop。/ tpage)
标题(' for循环pagemtimes的加速'
Xlabel('M'
ylim([0,inf])
titlestr = sprintf('乘以B(%d-by-%d)'乘以(m-by%d-%d)', n, p, n, k);
标题(t,titlestr)
结束
版权所有2021 MathWorks,Inc。
|

注释

要发表评论,请点击这里登录您的MathWorks帐户或创建新的。