昨天学习了一些简单的数组操作,包括数组声明、赋值,今天来学习一些对数组的整体操作:

1、统一赋值:

program Max
integer::a(5)
//!通过这一句,就可以把a数组的所有值全部赋值为5(没办法,为了代码有颜色,我只好把他们用c++注释符给注释掉了)
a=5
write(*,"(I1)")(a(i),i=1,5)
stop "over"
end

结果当然就是输出五个5咯:

其实这个stop“message”中的message是可以不用加的,但是吧,我觉得加上之后,在message里面随遍写点啥,后面兴许可以搞错误判断。

也可以这样子:

a=(/5,5,5,5,5/)
//!当然也是一样的效果,可以自己试一试

当然,数组运算有没有简单一些的办法嘞?答案是肯定的,比如说通过两个同维度的数组对另一个数组进行赋值:这里先设定两个同维度数组ArrayB,ArrayC,用他们对另外一个数组ArrayA进行赋值:

program Max
integer::ArrayB(4)
integer::ArrayC(4)
integer:: ArrayA(4)
ArrayB=3
ArrayC=4
!a=b+c
ArrayA=ArrayB+ArrayC
write(*,"(I3,I3,I3,I3)")(ArrayA(i),i=1,4)
stop "over"
end

program Max
integer::ArrayB(4)
integer::ArrayC(4)
integer:: ArrayA(4)
ArrayB=3
ArrayC=4
!a=b-c
ArrayA=ArrayB-ArrayC
write(*,"(I3,I3,I3,I3)")(ArrayA(i),i=1,4)
stop "over"
end

program Max
integer::ArrayB(4)
integer::ArrayC(4)
integer:: ArrayA(4)
ArrayB=3
ArrayC=4
!a=b*c
ArrayA=ArrayB*ArrayC
write(*,"(I3,I3,I3,I3)")(ArrayA(i),i=1,4)
stop "over"
end

program Max
integer::ArrayB(4)
integer::ArrayC(4)
integer:: ArrayA(4)
ArrayB=3
ArrayC=4
!a=b/c
ArrayA=ArrayB/ArrayC
write(*,"(I3,I3,I3,I3)")(ArrayA(i),i=1,4)
stop "over"
end

 你甚至可以用一些fortran的内置函数来进行操作:

program Max
REAL::ArrayB(4)
real::ArrayC(4)
real:: ArrayA(4)
ArrayB=3
ArrayC=4
//!开方
ArrayA=sqrt(ArrayB*ArrayB+ArrayC*ArrayC)
write(*,"(F5.2,F5.2,F5.2,F5.2)")(ArrayA(i),i=1,4)
stop "over"
end

行了,基础可以之后,来试试对一个二维数组进行处理

program mat
INTEGER::matrixA(4,4)
integer::matrixB(4,4)
integer::matrixC(4,4)
matrixA=1
matrixB=3
matrixC=matrixA*matrixB
write(*,"(I2,I2,I2,I2/I2,I2,I2,I2/I2,I2,I2,I2/I2,I2,I2,I2)")((matrixC(i,j),i=1,4),j=1,4)
stop "over"
end 

输出:

 好了,对整个数组的操作在就没啥好说的了,现在进入到下一块内容,切片操作:

其实看了一些fortran对数组切片操作的语法之后,第一个感觉就是,怎么越看越像python里的切片操作,除了坐标选择是使用"()"以外,没有太大的区别,这可能也就是编程语言的更新和发展吧,去其糟粕,取其精华,好了不多说了,开始。

切片的目的在于对部分数组进行操作而不影响数组其他元素,显然,数组的下标操作就是极为重要的了,这里就不和上面一样,全贴代码了,我直接敲一些语句就好,如果有需要的话,可以直接复制,改成适用于你程序的参数就好:

//!最简单的操作:取部分数组:
array(3:5)=2
//!取出array(3),array(4),array(5)这三个,直接给赋值为2
array(3:)=2
//!array(3)之后的数都赋值为2(包括array(3))
array(3,9,2)=2
//!array(3),array(5),array(7),arrray(9)这几个数赋值为2,其实就是arrray(counter,upperbound,step)
array(1:10)=array(10:1:-1)
//!这个就是数组的倒转,python直接就是a=a[:-1],算是对Fortran的改进吧
array(:)=array_one(:,2)
//!这个的意思就是把array_one的第二列赋值给array
array(:,:)=array_two(:,:,x)
//!和前面的同理,就是把三维矩阵array_two的第x个矩阵赋值给array

注意:必须是同维度才能操作,如果你是一个3*3的数组,偏要给一个2*2的数组赋值,必须切片,否则就会报错,别问为什么,大一刚学c++时候的惨痛教训!!!

简单的来一个吧:

program mainimplicit noneinteger row,colparameter(row=2)parameter(col=2)integer::a(2,2)integer::b(4)integer::c(2)integer i,jdata ((a(i,j),i=1,2),j=1,2)/1,2,3,4/b=(/5,6,7,8/)write(*,*)awrite(*,*)a(:,1)c=a(:,1)write(*,*)cc=a(2,:)write(*,*)c(2:1:-1)c=b(1:4:2)write(*,*)cstop "program over"end     //!彭国伦Fortran90那本书的ex0709不对劲,他原先的程序是这样子的:
program mainimplicit noneinteger row,colparameter(row=2)parameter(col=2)integer::a(2,2)=(/1,2,3,4/)integer::b(4)=(/1,2,3,4/)integer::c(2)write(*,*)awrite(*,*)a(:,1)c=a(:,1)write(*,*)cc=a(2,:)write(*,*)c(2:1:-1)c=b(1:4:2)write(*,*)cstop "program over"end
//!就老是会出现一个报错:Incompatible ranks 2 and 1 in assignment at (1)
//!我查了好多,但因为Fortran很老的缘故,并没有查出所以然来,只是有人在里面说a是个可变数组巴拉巴拉。
//!就离谱,没办法我就按之自己的方法对a数组进行赋值,就是最上面的代码,哎,他就对了,emm...百思不得其解啊

展示一下输出一下效果:

和书上的一模一样:

,唉,怎么说呢,实现一种功能的方法特别多,就拿c++来说吧,你要想实现一个数组赋值,你可以直接赋值,你也可以for循环,while循环进行赋值,python就更多了,numpy提供了好多种赋值方法,只要给数组赋值成功,怎么办都行,不需要在这纠结于形式。

再一个,再说个事儿,Fortran有个很怪的地方,对一个变量的声明是不能放在给其他的赋值语句之后的,这样子就会报错,感觉很不人性化,给大家看个很简单的例子:

program mainimplicit noneINTEGER::aa=8integer::bwrite(*,*)astop "over"
end 

哎,就离谱,可能后面的开发者实在是扛不住这么造(都写了几百行代码,忽然发现有个新功能要再声明几个新变量),所以后面c++,python等,不管是编译语言还是解释语言,都可以随时随地的去声明变量。

非常重要的两个数组命令:where和 forall:

where是一个通过逻辑判断来使用数组中的某些元素;

forall相当于用隐式循环来使用数组。

当然他们的用法是非常简单的,直接套用我下面的这个模板就ok,我就再不用代码段来展示运行成果了:

    //!where;where (!逻辑判断1)//!对满足逻辑判断要求的数组元素进行操作//!where是可以嵌套的,也可以用elsewhere来创造其他的操作判断:elsewhere(!逻辑判断(在这里是可有可无的))//!你甚至可以嵌套进行where(!逻辑判断2)...end whereend where//!forallforall (triplet1,triplet2,triplet3,... mask(!mask就是逻辑判断))//!其中tripleti 就是i=1:100,就是个隐含循环end forall

看到forall,你有没有想到啥:for循环,老朋友了!!!

今天就到这里吧,明天讨论一下Fortran中数组的保存以及一个非常重要的工具:可变数组。

Fortran学习5:数组2相关推荐

  1. Fortran学习杂记(一)

    Fortran学习杂记(一) 1. 内置函数 1) 数值运算 常见:- abs( ) - aimag( ) -conj( ) -max( ) ** -min( ) - mod(a, b) - real ...

  2. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  3. [ 转载 ] Java基础12--基础学习总结——数组

    java基础学习总结--数组 一.数组的基本概念 数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量. 数组的 ...

  4. python类的数组属性_Python学习之数组类型一:

    Python学习之数组类型一: Numpy中的向量与矩阵: 1.创建: 向量.矩阵均由array函数创建,区别在于向量是v=array( [逗号分隔的元素] ), 矩阵是M=array( [[ ]] ...

  5. 【PHP学习】—数组的定义和遍历(三)

    [PHP学习]-数组的定义和遍历(三) 一.常见的数组定义方式 二.遍历数组 三.二维数组 四.数组传递给页面 数组转json格式(一维数组) 五.数组传递给页面 数组转json格式(二维数组)

  6. java数组元素的排序_java学习之数组元素排序,冒泡排序和选择排序

    java学习之数组元素排序 选择排序 *返回值类型 void *参数列表 int[] arr * 分析:选择排序 * 第一次arr[0]与arr[1-4]比较,总共比较4次 * 第二次arr[1]与a ...

  7. Go语言学习笔记-数组、切片、map

    Go语言学习笔记-数组.切片.map 数组:同一数据类型元素的集合.是值类型,长度固定无法修改 声明格式:var 数组名字 [元素数量] 数据类型 var arr [3] int //声明定义了一个长 ...

  8. 学习-Java数组之foreach遍历数组之正负数数量统计

    第1关:学习-Java数组之foreach遍历数组之正负数数量统计 任务描述 相关知识 foreach 语句 编程要求 测试说明 任务描述 本关任务:使用 foreach 语句统计数组中正负数的个数. ...

  9. Java 学习笔记 - 数组类型互转

    Java 学习笔记 - 数组类型互转 数组类型转换 字符串数组 to (Integer.Long.Double)列表 传统方式 Java8 Stream方式 数组 to 数组 字符串数组 to (in ...

  10. Fortran二维数组赋值

    Fortran二维数组赋值 Fortran二维数组整体赋值有很多种方法,但大多数为定义类定义,或者在后续采用data.reshape.for循环整体赋值 data和reshape都可进行二维数组的任意 ...

最新文章

  1. Bootstrap笔记(记录不会的知识)
  2. 独家 | 探索性文本数据分析的新手教程(Amazon案例研究)
  3. prefixspan是挖掘频繁子序列,子序列不一定是连续的,当心!!!
  4. Spring基于Setter函数的依赖注入(DI)
  5. 梁建章的多米诺,混合办公的未知数
  6. win下 cmd 查询本机开了哪些端口 并查看开启端口的软件
  7. PresentViewController切换界面
  8. 巧用iptables五招免费搞定SYN洪水攻击
  9. 高校学生管理系统(课设毕设有源码)
  10. 联想g510拆键盘的简单方法_联想G510重点笔记本拆机教程.doc
  11. Java为Excel导出增加批注(POI)
  12. 生活随记 - 火星梦
  13. 教你几个Excel常用的数据分析技巧!
  14. 统计笔记3:statistical inference
  15. VMware Horizon 8 2111 部署系列(八)准备虚拟机模板
  16. 太阳能路灯c语言程序,基于单片机的智能太阳能路灯控制系统的设计方案
  17. 实现css文字垂直居中的8种方法
  18. 淘宝虚拟物品自动发货---DiPiPi网店自动发货助手免费版
  19. No Security No Safety!——基于Hypervisor技术的车联网安全网关基础平台
  20. 赶紧收藏起来,宝妈做自媒体短视频赚了1w,全靠这8个素材网站

热门文章

  1. G20伦敦峰会公告全文
  2. Docker容器的部署安装与管理
  3. 【最大公约数 GCD】 --- 常用四大算法(辗转相除法,穷举法,更相减损法,Stein算法)
  4. 多级反馈队列调度算法C语言
  5. Exploring the Amazon Echo Dot, Part 1: Intercepting firmware updates
  6. DUC/STDN的caffe源码实现
  7. python常用模块——re
  8. 商用WiFi:迈外迪向左,潮WiFi向右
  9. openjdk 源码下载地址
  10. 牛客竞赛题库 选村长