find函数matlab_关于如何在matlab中导入并翻译Hypemesh导出的大型刚度矩阵txt文本(下)...

本文主要是介绍find函数matlab_关于如何在matlab中导入并翻译Hypemesh导出的大型刚度矩阵txt文本(下)...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    在上个部分,我们介绍了如何将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一起讨论。

这篇关于find函数matlab_关于如何在matlab中导入并翻译Hypemesh导出的大型刚度矩阵txt文本(下)...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/320557

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87