Loren在Matlab的艺术上

将想法转化为matlab

名词矩阵函数

今天的Guest Blogger是Mary Fenelon的玛丽芬龙,是Mathworks优化和数学的产品营销经理。在今天的帖子中,她描述了如何使用新的名词矩阵函数可以简化您的代码并提高性能。
批次,页面明智矩阵乘法函数Pagemtiimes.,以及页面明智的转置PageTranspose.和复杂的共轭转发Pagecranspose.函数已在R2020B中添加到MATLAB®。新功能使N-D阵列是用于密集矩阵的容器的操作,更容易编写和运行更快。
例如,如果a和b是3-d阵列,并且您希望将阵列c计算为通过将包含在A和B的前两个维度中包含的矩阵乘以矩阵而形成的矩阵的集合,您可以使用该语句执行此操作c = pagemtimes(a,b)。
除了用于循环的替代方案Pagemtiimes.dlmti为了dlarray.在深入学习工具箱和Pagefun.为了GPUARRAY.并在并行计算工具箱中分布式阵列。这些仍然可用,但现在您可以使用Pagemtiimes进行常规阵列以及dlarray.GPUARRAY.
有时您只需要转换矩阵集合。现在你可以使用PageTranspose.代替换乘

更轻松

在该示例中,要乘以的矩阵存储在4-D阵列的前两个维度中
A =兰特(4,5,6,7);
B =兰特(2,5,6,7);
此双嵌套FOL-LOOP计算矩阵矩阵产品。s manbetx 845
C1 =零(尺寸(a,1),尺寸(b,1),6,7);
为了p = 1:尺寸(a,3)
为了q = 1:尺寸(a,4)
C1(:,:,p,q)= a(:,p,q)* b(:,:,p,q)。';
结尾
结尾
使用Pagemtiimes.,可以将该代码简化为单个函数调用:
c2 = pagemtimes(a,'没有任何',b,'转移');
这肯定更容易。字符串选项指定应在乘法中使用页面 - WIDEθ的θ。Pagemtiimes.隐含地扩展超出三个以乘以分页矩阵的所有组合。

快点

现在我已经让这种情况更容易,如何更快地求怎样?速度速度是否随着N-D阵列的大小而变化?下面的循环通过一组矩阵,其具有不同行大小的第一个矩阵,但否则固定尺寸。我绘制了时代和加速。
RNG('默认');再现性的百分比
n = 100;
k = 2;
P = 10000;
mset = 10:10:100;
msize = numel(mset);
tloop = zeros(msize,1);
Tpage =零(msize,1);
为了i = 1:numel(mset)
m = mset(i);
a = rand(m,n,p);
b = rand(n,k);
CPAGE = Pagemtimes(A,B);
f = @()pagemtimes(a,b);
TPAGE(i)= Timeit(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需要更多时间Pagemtiimes.。速度升级图表明使用的好处Pagemtiimes.当有许多小矩阵但即使对于较大的值也是最大的M.,加速仍然很大。较小矩阵的改进更为显着,因为被消除的开销构成了整个时间的更大百分比。
我喜欢使用时代代替t/TOC.对于时间(见以前的帖子时代)即使它需要将代码置于函数中。时代运行代码多次并采取中值测量。这是推荐的方法衡量代码的性能。即便如此,使用代码需要一个非常少量的时间运行,例如矩阵大小很小时,时代将返回准确的时机会有困难。在这种情况下的建议是在循环中多次运行代码。
如果您尝试为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)
数字('位置',[100,100,1200,450])
t = tiledlayout(1,2);
nextdile.
绘图(MSET,TPAGE,'*');
抓住
绘图(mset,tloop,'o');
传奇({'pagemtimes''for-loop'},'地点''西北');
标题('次'的)
Xlabel('M'的)
ylabel('秒'的)
抓住离开
nextdile.
绘图(MSET,TLOOP。/ TPAGE)
标题('循环的Pagemtimes的加速'的)
Xlabel('M'的)
ylim([0,INF])
titlestr = sprintf('乘以(%d-by%d)'乘以(m-by%d-%d)',n,p,n,k);
标题(t,titlestr)
结尾
版权所有2021 MathWorks,Inc。
|

评论

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