许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  MATLAB find函数应用:导入并解析HyperMesh导出的大型刚度矩阵TXT文本(下篇)

MATLAB find函数应用:导入并解析HyperMesh导出的大型刚度矩阵TXT文本(下篇)

阅读数 3
点赞 0
article_banner

   在上个部分,我们介绍了如何将Hypemesh导出的大型刚度矩阵快速导入matlab,并保存成data_K.mat文件。这一节,我们将介绍如何将它翻译成matlab可以使用的矩阵变量,并参与运算。

    由于这个大型刚度矩阵125万x125万≈1e12。matlab甚至其他计算软件无法保存这个大的一个矩阵文件。而这个刚度矩阵作为稀疏矩阵其中非零元素的数目只有有500多万。采用sparse稀疏矩阵技术是可以保存。

这里简单介绍一下这个Hypemesh导出的大型刚度矩阵txt文本。如图DMIG开头的标识符是换行符,后面两列是表示这条非零元素在刚度矩阵中列数的信息。我们已经将左边字母和符号等批量删除,得到了右边textread函数可以直接读取的文本。则换行符转化成了某行第三列为0。

35f05e1968607f9b59724e313e11f97e.png

    下面是采用通俗易懂的循环语句进行稀疏矩阵的赋值。循环语句就是逐行扫略,碰到换行符,行号k更新一次。随后计算这条数据的列数,将文本中第三列数据赋值给稀疏矩阵data。我们预估一下这样扫略需要多长时间,先计算1000行需要44.53秒,再对5165882行进行预估,可以看到用循环语句需要63.9小时才能算完。电脑跑两天半,实际上对于这么大的循环,电脑后期会越跑越慢,所以电脑可能得跑三天才能算完,这非崩即废。

6820f80cb81465ff0746fc6885fc08ce.png

clear allclcclose alltic load data_KbufenAX = data_K; data=sparse(41703*3,41703*3);k=1;i=0;% while i<5165882while i<1000    i=i+1;    if(bufenAX(:,3)==0)        k=k+1;    end    data(k,3*(bufenAX(i,1)-1)+bufenAX(i,2))=bufenAX(i,3);    data(3*(bufenAX(i,1)-1)+bufenAX(i,2),k)=bufenAX(i,3);endtoc

      所以肯定有更高效的赋值方式。那就是矩阵操作。怎么来形容这个矩阵操作呢?这么说吧,矩阵操作就像高考空间几何大题里的几何法,而循环语句就相当于代数法。哇,这个比喻真是太贴切了。所以循环语句通俗易懂,易于想到,提笔就写,但是计算耗时。而矩阵操作需要进一步思考,不熟悉matlab矩阵运算的规则的话,往往不好理解,但是计算效率很高。代码也很简洁。大家要注意matlab的基本运算单位是矩阵,如果以其他编程语言比如C语言等编程思维进行编写,难以发挥出矩阵运算的优势。对于小型数据看不出效率区别,但是像我们今天介绍的大型数据,计算效率问题将异常突出。所以很多人诟病matlab中for循环耗时,而其他语言循环语句执行很高效。这只是因为matlab为你提供了飞机和自行车,而你非要骑个自行车跑。当然想开飞机就需要更多经验和技术,这并不像骑自行车那么简单。

     好了,我们继续介绍如何使用矩阵操作实现赋值过程,可以看到相同的过程,使用矩阵操作只需要2s左右就可以完成。对于提取一次可以用循环算它几天几夜,但是多次提取,甚至需要matlab和有限元计算软件联合仿真并且中间以txt文本传输刚度矩阵等数据的话,循环操作是不现实的,只能使用矩阵操作来实现这里对矩阵操作的部分语句进行了注释。能够读懂循环语句的同学,应该可以看懂这部分代码。个别函数不清楚,可以查询,比如在左侧command window输入 doc repelem可以查询关于这个repelem函数的用法和用例。

clear allclcclose alltic load data_K[u v]= find(data_K(:,3)~=0);[u_hang v_hang]= find(data_K(:,3)==0);data_new = data_K(u,:);lie = 3*(data_new(:,1)-1) +data_new(:,2);hang_num = diff(u_hang)-1;%get  column number of each rowhang_num = [hang_num ;size(data_K,1) - u_hang(size(u_hang,1))];%add last rowvv = 1:size(hang_num,1);hang = repelem(vv,hang_num')';K = sparse(hang,lie,data_new(:,3));%% make symmetry assignpian = K - diag(diag(K));K = pian+pian'+diag(diag(K));toc

  文末依然附上本次使用的txt文本和相关代码文件。供大家学习使用。

链接:https://pan.baidu.com/s/1edm_eKDGUp1YJVM620tjFw

提取码:ypsv

   目前MATLAB学习笔记总用户数已经达到7641,多篇推送受到大家多次收藏与分享。说明很多人在使用微信搜一搜查询学习资料,也说明MATLAB学习笔记的程序实例的实用性。感谢大家的支持。

9a35faf77c350d68ebb42669393e0fec.png

   如果对程序实例中的代码有疑问,可发邮件至weizhuanaa@163.com一起讨论。


 相关资源:多目标多空间协作模型用于解决高光谱图像解散中频谱变异问题.zip...
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空