Fortran学习笔记

news2026/5/10 0:31:48
这是我之前学习Fortran时做到笔记分享出来当个备份 Fortran是一门非常古老的编程语言但是至今依然有人在使用。 建议利用闲暇时间学习!1、编译命令g95 –c a.f90将a.f90编译为名为a.o的目标文件。g95 h.f90编译h.f90并将其链接以生成可执行文件a.out。g95 -c h1.f90 h2.f90 h3.f90编译多个源文件。 如果顺利则创建对象文件h1.oh2.o和h3.o。g95 -o a h1.f90 h2.f90 h3.f90编译多个源文件并将它们链接到一个名为’a’的可执行文件。2、print*, huge(a)返回变量a能存放的最大值。3、integer(kind 2) :: a指定a变量的字节数。4、kind(i)返回i变量所占字节数。5、character (len 40) :: a指定字符串a的长度。6、a(1:4)对字符串a切片。7、数据类型的作用它决定了变量内存的大小和布局; 可存储在该内存中的值范围; 以及可以应用于变量的操作集。8、所有Fortran程序都以关键字program开头以关键字end program名称 结尾。9、implicit none变量显示声明。10、Fortran中的注释以感叹号开头。11、Fortran的行连接符是相当于C的“\”。12、Fortran不区分大小写。13、Fortran变量类型Integer整数Real实数Complex复数Logical逻辑Character字符。14、复数的初始化cx (3.0, 5.0) ! cx 3.0 5.0i。cx cmplx (x, y) ! cx x yi。15、real, parameter :: pi 3.14声明常量。16、算术运算符-*/**。17、判断if (expression) then ...... end if或a: if (expression) then ...... end if a​ Fortran支持else。多分支语句a:select case (expression) case (selector1) ...... case (selector2) ...... case default ...... end select acase (91:100) 在91~100之间激活。18、逻辑值.true.和.false.。19、关系运算符/。20、逻辑运算符.and..or..not..eqv..neqv.。21、循环do var start, stop [,step] ...... end do条件循环do while (logical expr) ...... end doFortran允许为循环设置标签。22、跳转语句exit相当于C语言里的break。cycle相当于C语言里的continue。stop终止程序。23、a//b讲ab两个字符串拼接。24、len(string)返回字符串的长度。25、index(string,sustring)它找到字符串string中子字符串sustring的位置如果找不到则返回0。26、achar(int)它将整数转换为字符。27、iachar(c)它将字符转换为整数。28、trim(string)它返回删除了尾随空格的字符串。29、scan(string, chars)对于“chars”中包含的任何字符的第一次出现它从左到右搜索“string”除非back .true。。 它返回一个给出该字符位置的整数如果没有找到“chars”中的字符则返回零。30、verify(string, chars)它从左到右扫描“字符串”除非back .true。第一次出现“chars”中没有包含的任何字符。 它返回一个给出该字符位置的整数如果只找到“chars”中的字符则返回零。31、adjustl(string)它左对齐“字符串”中包含的字符。32、adjustr(string)它右对齐“字符串”中包含的字符。33、len_trim(string)它返回一个等于“string”lenstring长度的整数减去尾随空格的数量。34、repeat(string,ncopy)它返回一个长度等于“ncopy”的字符串乘以“string”的长度并包含“ncopy”连接的“string”副本。35、lle(char, char)比较第一个字符是否在词法上小于或等于第二个字符。36、lge(char, char)比较第一个字符是否在词法上大于或等于第二个字符。37、lgt(char, char)比较第一个字符是否在词法上大于第二个字符。38、llt(char, char)比较第一个字符是否在词法上小于第二个字符。39、call date_and_time(d, t)调用子程序获取时间结果“年月日”返回到d字符串变量“时分秒”返回到t变量。40、real, dimension(5) :: array创建一维数组大小为5。41、array (/1.5, 3.2,4.5,0.9,7.2 /)初始化数组。42、array(1)使用数组array的第一个数据。43、integer, dimension (5,5) :: array_2建立二维数组。44、real, dimension(2:6) :: array_3建立一个一维数组并指定索引号。45、integer, dimension (-3:2,0:4) :: array_4建立一个二维数组并指定索引号。46、subroutine func(a)定义函数func(a)。如果a是数组那么就要在函数里声明一个同名数组来使用。47、size(a)获取数组a的大小。48、a(1:7) 5数组a的第1到第7个数据都是5。49、a(8:) 0数组a第8个以后的数据都是0。50、b(2:10:2)1数组b的第2到第10个元素每隔2个都是1。51、dot_product(array_a, array_b)此函数返回两个输入向量的标量积其长度必须相同。52、matmularray_aarray_b它返回两个矩阵的矩阵乘积它必须是一致的即具有类似mk和kn的维数。53、all(a5)判断a数组中是否所有元素都大于554、all(a5 .and. a10)划定范围。55、any(a5)判断a数组中是否有元素都大于556、count(a5)统计数组a中大于5的数据个数。57、maxval(a)找到数组a的最大值。58、minval(a)找到数组a的最小值。59、sum(a)对a的所有元素求和。60、product(a)对a的所有元素求积。61、allocated(array)检查是否分配了数组。62、lbound(array, dim)它返回数组的最小有效下标。 如果没有将dim维度作为参数给出则会得到一个整数向量如果包含dim则会得到具有该维度的较低维度的整数值。63、ubound(array, dim)它返回可用的最大下标。64、shape(source)它将数组的形状作为整数向量返回。65、size(a,dim 1)返回数组a中的数据数。66、merge(tsource, fsource, mask)此函数连接两个数组。 如果mask中的条件是.true它给出tsource中的元素。 如果掩码中的条件为.false则为fsource。 tsource和fsource这两个字段必须具有相同的类型和相同的形状。 结果也是这种类型和形状。 面具也必须具有相同的形状。67、pack(array, mask, vector)它通过掩码控制将数组打包到矢量。 逻辑数组掩码的形状必须与数组一致否则掩码必须是标量。 如果包含向量则它必须是秩为1的数组即向量其元素至少与掩码中为真的元素一样多并且具有与数组相同的类型。 如果mask是一个值为.true的标量。 然后矢量必须具有与数组相同数量的元素。68、spread(source, dim, ncopies)它返回一个与参数源相同类型的数组其等级增加1。 参数dim和ncopies是整数。 如果ncopies为负数则使用零值。 如果source是标量则spread会变成带有ncopies元素的向量这些元素都与source具有相同的值。 参数dim指示要扩展的索引。 它必须在1和1的范围内源的等级如果源是标量则dim必须是1。 参数ncopies是新维度中的元素数。69、unpack(vector, mask, array)它将矢量分散到掩码控制下的数组中。 逻辑阵列掩码的形状必须与数组一致。 数组向量必须具有等级1即它是向量其具有至少与掩码中为真的元素一样多的元素并且还必须具有与数组相同的类型。 如果数组作为标量给出那么它被认为是一个与掩码具有相同形状的数组并且到处都是相同的标量元素。结果将是一个与mask相同形状的数组与vector类型相同。 值将是来自可接受的向量的值而在数组中的其余位置中保留旧值。70、reshape(source, shape, pad, order)它构造一个具有指定形状形状的数组该数组从给定数组源中的元素开始。 如果不包括垫那么源的尺寸必须至少是产品形状。 如果包含pad则它必须与source具有相同的类型。 如果包含order则它必须是一个形状与形状相同的整数数组并且值必须是1,2,3…n的排列其中n是形状中元素的数量它必须小于或等于7。71、interface……end interface先声明函数及其内部的变量后面再定义函数具体操作。72、transpose (matrix)它转换矩阵向右掰。73、x cshift ( a, shift 2)从a数组的第二个数据开始输出再回环到a数组的第二个数据前。74、x eoshift ( a, shift 2)从a数组左移两个位输出。75、maxloc(array, mask)它返回数组数组中最大元素的位置如果仅包含掩码的掩码则返回位置返回位置结果为整数向量。76、minloc(array, mask)它返回数组数组中最小元素的位置如果仅包含掩码的掩码则返回位置返回位置结果为整数向量。77、real, dimension (:,:), allocatable :: a声明二维动态数组a。78、allocate ( a(s1,s2) )为声明的动态数组a分配内存。79、deallocate (a)释放内存。80、read*, s1, s2从控制台输入两个值把它们存到变量s1、s2中。81、data a /7,8,9,10,11/初始化一维数组a。82、data b(1,:) /1,1,1/初始化二维数组的第一行。83、data (c(i),i 1,10,2) /4,5,6,7,8/对c数组的1~10元素范围内以步长2依次赋值。84、data (c(i),i 2,10,2)/5*2/对c数组的2~10元素范围内以步长2依次赋值为2。85、where( a0 ) …… elsewhere …… end where对数组a中少于0的元素都执行……不少于0点元素都执行……。86、结构体type type_name …… end type type_name87、type(Books) :: book1创建Books类型的结构体对象book1。88、book1%a C对结构体对象book1的a元素赋值为““C””。89、type(Books), dimension(2) :: list建立一个有两个元素每个元素类型是Books的数组。90、list(1)%a C给数组list的第一个元素的a赋值。91、integer, pointer :: p1声明一个指针。92、allocate(p1)为指针分配内存此时p1就可以当成一个变量来用。93、integer, target :: t1t1是一个可以别指向的变量。94、p1t1p1指针指代t1变量。95、nullify(p1)断开p1指针的指向。96、associated(a)判断a变量释放存在97、associated(p1, t1)判断p1是否指向t1变量。98、Print (f10.7), pi输出长度为10小数点后7位。99、Print (e16.4), pi/100用科学记数法输出。100、format语句不做介绍。101、open (unit number, file name)打开文件。open参数unit9~99指定文件编号。IOSTAT ios它是I/O状态标识符应该是整数变量。如果open语句成功则返回的ios值为零否则为非零值。ERR err它是一个标签控件在出现任何错误时跳转到该标签。FILE fname文件名字符串。STATUS sta它显示文件的先前状态。一个字符串可以有三个值NEWOLD或SCRATCH之一。关闭或程序结束时创建并删除临时文件。ACCESS acc它是文件访问模式。可以具有两个值中的任何一个SEQUENTIAL或DIRECT。默认为SEQUENTIAL。FORM frm它给出了文件的格式化状态。可以具有两个值FORMATTED或UNFORMATTED中的任何一个。默认值为UNFORMATTED。RECL rl它指定直接访问文件中每条记录的长度。102、close(1)关闭unit指定的编号为1的文件。103、write(1,*) x 把x变量的内容输入到编号为1的文件。104、read(2,*) p把编号2所代表的文件的内容输入变量p。105、定义函数function name(arg1, arg2, ....) …… end function [name]106、如果函数有返回值那么就要在函数内部定义一个与函数名一样的变量这个变量的值就是返回值。或将函数名定为function name(arg1, arg2, …)result(return_var_name)。107、contains关键字放在一个子程序的定义前说明这个子程序是内嵌内联的。108、函数和子程序的区别函数不修改其参数子例程不返回值但可以修改其参数。109、模块定义module name …… end module [name]110、使用模块use module_name111、可以使用private和public属性控制模块代码的可访问性。主程序不可访问。但是其他模块子程序可以访问它们。112、ABS (A)它返回A的绝对值。113、AIMAG (Z)它返回复数Z的虚部。114、AINT (A [, KIND])它将A的小数部分截断为零返回一个实数整数。115、ANINT (A [, KIND])它返回一个实数值最接近的整数或整数。116、CEILING (A [, KIND])它返回大于或等于数字A的最小整数。117、CMPLX (X [, Y, KIND])它将实变量X和Y转换为复数X iY; 如果Y不存在则使用0。118、CONJG (Z)它返回任何复数Z的复共轭。119、DBLE (A)它将A转换为双精度实数。120、DIM (X, Y)它返回X和Y的正差。121、DPROD (X, Y)它返回X和Y的双精度实数。122、FLOOR (A [, KIND])它提供小于或等于数字A的最大整数。123、INT (A [, KIND])它将数字实数或整数转换为整数将实部截断为零。124、MAX (A1, A2 [, A3,...])它返回参数的最大值所有这些都是相同的类型。125、MIN (A1, A2 [, A3,...])它返回参数的最小值所有这些都是相同的类型。126、MOD (A, P)它返回A除以A的余数两个参数的类型相同A-INTA/P* P。127、MODULO (A, P)它返回A模P A-FLOORA/P* P。128、NINT (A [, KIND])它返回最接近的数字A的整数。129、REAL (A [, KIND])它转换为实际类型。130、SIGN (A, B)它返回A的绝对值乘以P的符号。基本上它将B的符号传递给A。131、ACOS (X)它以弧度为单位返回范围0π中的反余弦值。132、ASIN (X)它以弧度为单位返回范围-π/ 2π/ 2的反正弦值。133、ATAN (X)它以弧度为单位返回范围-π/ 2π/ 2的反正切。134、ATAN2 (Y, X)它以弧度为单位返回范围-ππ中的反正切。135、COS (X)它以弧度返回参数的余弦值。136、COSH (X)它以弧度为单位返回参数的双曲余弦值。137、EXP (X)它返回X的指数值。138、LOG (X)它返回X的自然对数值。139、LOG10 (X)它返回X的常用对数基数10值。140、SIN (X)它以弧度形式返回参数的正弦值。141、SINH (X)它以弧度为单位返回参数的双曲正弦值。142、SQRT (X)它返回X的平方根。143、TAN (X)它以弧度为单位返回参数的正切值。144、TANH (X)它以弧度形式返回参数的双曲正切值。145、IGITS (X)它返回模型的有效位数。146、EPSILON (X)它返回的数字几乎可以忽略不计。 换句话说它返回最小值使得REAL1.0KINDX EPSILONX不等于REAL1.0KINDX。147、HUGE (X)它返回最大数量的模型。148、MAXEXPONENT (X)它返回模型的最大指数。149、MINEXPONENT (X)它返回模型的最小指数。150、PRECISION (X)它返回小数精度。151、RADIX (X)它返回模型的基础。152、RANGE (X)它返回十进制指数范围。153、TINY (X)它返回模型的最小正数。154、EXPONENT (X)它返回模型编号的指数部分。155、FRACTION (X)它返回数字的小数部分。156、NEAREST (X, S)它返回给定方向上最近的不同处理器编号。157、RRSPACING (X)它返回给定数字附近的模型数的相对间距的倒数。158、SCALE (X, I)它将real乘以其基数乘以整数幂。159、SET_EXPONENT (X, I)它返回数字的指数部分。160、SPACING (X)它返回给定数字附近的型号的绝对间距。161、BIT_SIZE (I)它返回模型的位数。162、BTEST (I, POS)比特测试。163、IAND (I, J)逻辑和。164、IBCLR (I, POS)清楚一点。165、IBITS (I, POS, LEN)位提取。166、IBSET (I, POS)设置位。167、IEOR (I, J)独家OR。168、IOR (I, J)包容性或。169、ISHFT (I, SHIFT)逻辑转变。170、ISHFTC (I, SHIFT [, SIZE])循环移位。171、NOT (I)逻辑补充。172、ACHAR (I)它返回ASCII整理顺序中的第I个字符。173、ADJUSTL (STRING)它通过删除任何前导空格和插入尾随空白来调整字符串。174、ADJUSTR (STRING)它通过删除尾随空白和插入前导空格来调整字符串。175、CHAR (I [, KIND])它返回机器特定整理顺序中的第I个字符。176、IACHAR (C)它返回ASCII整理顺序中字符的位置。177、ICHAR (C)它返回机器处理器特定整理顺序中字符的位置。178、INDEX (STRING, SUBSTRING [, BACK])它返回STRING中最左边的最右边如果BACK是.TRUE。SUBSTRING的起始位置。179、LEN (STRING)它返回字符串的长度。180、LEN_TRIM (STRING)它返回字符串的长度不带尾随空白字符。181、LGE (STRING_A, STRING_B)词汇量大于或等于。182、LGT (STRING_A, STRING_B)词汇大于。183、LLE (STRING_A, STRING_B)词汇小于或等于。184、LLT (STRING_A, STRING_B)词汇量小于。185、REPEAT (STRING, NCOPIES)重复串联。186、SCAN (STRING, SET [, BACK])它返回属于SET的STRING最左边的索引最右边如果BACK是.TRUE。如果没有则返回0。187、TRIM (STRING)删除尾随空白字符。188、VERIFY (STRING, SET [, BACK])验证字符串中的字符集。189、KIND (X)它返回kind类型参数值。190、SELECTED_INT_KIND (R)它返回指定指数范围的类型参数类型。191、SELECTED_REAL_KIND ([P, R])实物类型参数值给定精度和范围。192、LOGICAL (L [, KIND])在具有不同种类类型参数的逻辑类型的对象之间转换。193、precision(a)返回a变量的小数点精度。194、range(a)返回变量a的指数的小数范围。195、bit_size(i)i占了多少位196、selected_real_kindp10,r99返回精度为10位小数所需的种类值范围至少为10-99到10 99。——谙弆悕博士Ailan Anjuxi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2599052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…