matlab 大型矩阵运算效率优化

这篇具有很好参考价值的文章主要介绍了matlab 大型矩阵运算效率优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近遇到1500*1500*1500*1500量级的运算。用matlab来计算的话运算效率极低。因此需要对matlab代码进行优化:

原始代码(其中UAt,XA, XB,YA, YB是1500*1500的矩阵):

tic
for m=1:size(UAt,1)
    tic
    for n=1:size(UAt,2)
        RAB=sqrt((XB-XA(1,n)).^2+(YB-YA(m,1)).^2+dAB^2);
        Um=UAt(m,n)*(1i*k-1./RAB).*exp(1i*k*RAB)*dAB./RAB.^2;
        UBi_1=Um+UBi_1;
    end
    toc
    m
end
toc

原始运算效率(window笔记本,2080ti显卡,i710750h cpu):

matlab 大型矩阵运算效率优化

 思路一,原始的代码里头用了循环套循环的方法来做,但是这种方法在matlab这种以矩阵运算见长的语言上是不适合的。因此将循环改造为矩阵运算:

xa = ((-(size(UAt,2)-1)/2:(size(UAt,2)-1)/2)*dx0);
ya = (-(-(size(UAt,1)-1)/2:(size(UAt,1)-1)/2)*dx0);
xb = ((-(size(UBi,2)-1)/2:(size(UBi,2)-1)/2)*dx0);
yb = (-(-(size(UBi,1)-1)/2:(size(UBi,1)-1)/2)*dx0);
ind12 = xb.^2+(xa.^2)'-2*xa'*xb;
ind34 = yb.^2+(ya.^2)'-2*ya'*yb;
ind34 = (ind34);
ind12 = (ind12);
ind12 = reshape(ind12,[1,1,size(ind12)]);
ind34 = reshape(ind34, [size(ind34),1,1]);% [yb, ya(m), xb, xa(n)]
rab = sqrt(ind12+ind34+dAB2);
uab = reshape(UAt,[size(UAt,1),length(ya),size(UAt,2),length(xa)]);
rab_dot_inv = 1./rab;
um = uab.*(1i*k-rab_dot_inv).*exp(1i*k*rab)*dAB.*rab_dot_inv.*rab_dot_inv;
ubi_1 = sum(um,[2,4]);

 这个时候。由于占用的内存实在是太多了。系统报错:

matlab 大型矩阵运算效率优化

在循环和矩阵运算(内存消耗)之间做trade off:


xa = ((-(size(UAt,2)-1)/2:(size(UAt,2)-1)/2)*dx0);
ya = (-(-(size(UAt,1)-1)/2:(size(UAt,1)-1)/2)*dx0);
xb = ((-(size(UBi,2)-1)/2:(size(UBi,2)-1)/2)*dx0);
yb = (-(-(size(UBi,1)-1)/2:(size(UBi,1)-1)/2)*dx0);
clear UBi
XB = reshape(XB,[1,size(XB)]);
for m=1:size(UAt,1)
    b = (YB-ya(m)).^2+dAB^2;
    b = reshape(b, [1,size(b)]);
    m
    step = 10;
    total = 1;
    tic
    for s=1:size(UAt, 2)/step
        rg = min(s*step-1,size(UAt, 2));
        a = xa(total:rg);
        a = reshape(a,[length(a),1,1]);
        
        u = UAt(m,total:rg);
        ind12=(a-XB).^2;
        
        ind123 = b + ind12;
        rab = sqrt(ind123);
        clear ind123;
        clear ind12;
        rab_inv = 1./rab;
        left = (1i*k-rab_inv).*rab_inv.^2.*exp(1i*k*rab)*dAB;
        clear rabinv
        clear rab
        
        UBi_1 = reshape(pagemtimes(u,left),size(UBi_1))+UBi_1;
        total = rg+1;
    end
    toc
end

 发现,反而更加耗时了:

matlab 大型矩阵运算效率优化

说明matlab在cpu内对三维以上的矩阵运算优化不够?

我们测试一下gpu上的表现,使用gpuArray,首先测试原始的代码,做如下的改动:

XA=gpuArray(XA);
XB= gpuArray(XB);
YA = gpuArray(YA);
YB=gpuArray(YB);
UAt = gpuArray(UAt);
dAB = gpuArray(dAB);

 matlab 大型矩阵运算效率优化

 提速惊人!

我们测试之前的trade off版本在gpu上的表现:

xa = gpuArray(xa);
ya = gpuArray(ya);
xb=gpuArray(xb);
yb=gpuArray(yb);

matlab 大型矩阵运算效率优化

效率还是不如不加矩阵运算的初始版本。

最终的优化版本:

XA=gpuArray(XA);
XB= gpuArray(XB);
YA = gpuArray(YA);
YB=gpuArray(YB);
UAt = gpuArray(UAt);
dAB = gpuArray(dAB);
UBi_1=XB*0;

tic
for m=1:size(UAt,1)
    tic
    b = (YB-YA(m,1)).^2+dAB^2;
    for n=1:size(UAt,2)
        RAB=sqrt((XB-XA(1,n)).^2+b);
        rab_inv = 1./RAB;
        Um=UAt(m,n)*(1i*k-rab_inv).*exp(1i*k*RAB)*dAB.*rab_inv.^2;
        UBi_1=Um+UBi_1;
    end
    toc
    m
end
toc

另外需要注意的是,测试过程中发现,用笔记本的显卡,用了一段时间之后,速度就掉下来了。这个主要是因为笔记本显卡温度上去了,烧到60摄氏度以上了。所以性能下降。文章来源地址https://www.toymoban.com/news/detail-488016.html

到了这里,关于matlab 大型矩阵运算效率优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 向量化实现矩阵运算优化(一)

       xsimd是C++的一个开源simd库,实现了对常见simd指令的封装,从而使得simd的操作更为简单。接下来先从两个简单的例子来入门xsimd。    上述demo实现了两个向量相加的操作 ,由于每次都能从vector当中加载size个数据,因此对剩余的不能进行vectorize的数据进行了分别处理。比

    2024年02月08日
    浏览(41)
  • MATLAB矩阵基本运算的实现(一)

    MATLAB是matrixlaboratory两个词的组合,意为矩阵工厂(矩阵实验室),强大的矩阵运算能力是MATLAB的一个重要的特点,下面我就为大家整理了一下利用MATLAB实现矩阵基本运算的方法。 一、矩阵的加减法 矩阵加减法运算必须保证参与运算的矩阵是同维数,就是在算例中的a和b矩阵,

    2023年04月08日
    浏览(44)
  • 4.利用matlab符号矩阵的四则运算(matlab程序)

    1. 简述     符号对象的建立 sym函数 sym函数用于建立单个符号对象,其常用调用格式为: 符号对象名=sym(A) 1 将由A来建立符号对象,其中,A可以是一个数值常量、数值矩阵或数值表达式(不加单引号),此时符号对象为一个符号常量;A也可以是一个变量名(加单引号),这时符号对

    2024年02月13日
    浏览(48)
  • matlab 矩阵逆运算的条件数

    本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。

    2024年02月09日
    浏览(39)
  • MATLAB数值计算——矩阵运算乘法、除法、乘方

    矩阵是线性代数的基本单元 矩阵含有M行N列数值 矩阵中的元素可以是实数或复数 矩阵相关的基本运算:加、减、内积、逆矩阵、转置、线性方程式、特征值、特征向量、矩阵分解 运算符: 注:矩阵的乘法运算中没有乘法交换律 运算符: * 注: x=B/A是方程x A=B的解。即x=A的逆

    2024年01月16日
    浏览(38)
  • MATLAB矩阵运算及变换与应用(二)

    1)了解矩阵运算与数组运算的基本原理和规则; 2)掌握矩阵运算和数组运算的方法; 3)熟悉常见运算函数的使用; 4)熟悉矩阵结构变换的方法; 5)掌握线性方程组的求解方法和技巧。 2-1)、已知向量x=[1 2 3],y=[4 5 6],求?的结果。   2-2)、已知 求下列表达式的值 (

    2023年04月15日
    浏览(32)
  • 【矩阵的创建与基本运算】——matlab基础

    如果我要创立一个两行两列分别为1 2 3 4 的矩阵该怎么做呢? 用中括号创建,每个元素之间用空格隔开,每行之间用分号隔开即可 第一个参数为行,第二个参数为列。创建一个两行三列元素全为0的矩阵。 第一个参数为行,第二个参数为列。创建一个四行三列元素全为1的矩阵

    2024年02月17日
    浏览(39)
  • matlab基础知识加矩阵运算初步

    ** matlab(matrix laboratory)** 功能符号 1.分号(;) 不让matlab显示运算结果,抑制输出 2.续行号(…) 某行命令太长,指令行必须多行书写时,使用“…\\\"处理,表示下一行是上一行的连续 常用指令 1.cd 显示或改变工作目录 2.clc 清空命令行窗口 3.clear 清除所有变量 clear+变量名 清除一

    2024年02月10日
    浏览(34)
  • Matlab 数字图像 第二章 矩阵及其运算

    目录 2.1 矩阵的创建 2.1.1 直接输入: 2.1.2 载入外部数据文件 2.1.3 利用内置函数创建 2.2 矩阵的寻访 2.2.1 下标元素访问 2.2.2  访问单元素 2.3 矩阵的拼接 2.3.1 矩阵拼接符[] 2.3.2  函数 2.4 矩阵的运算 2.4.1 加减 2.4.2 乘除 2.4.3乘方 2.4.4 按位运算 2.4.5 行列式与秩 2.4.6 逆与迹 2.4.7 矩

    2023年04月09日
    浏览(40)
  • matlab使用教程(5)—矩阵定义和基本运算

            本博客介绍如何在 MATLAB 中创建矩阵和执行基本矩阵计算。         MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言,数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形,在这种意义上沿任何维度的分量向量

    2024年02月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包