回 帖 发 新 帖 刷新版面

主题:[讨论]FORTRAN 数组运算不方便啊。。。

以前编程没用到多少数组运算,今天试了试,真是没MATLAB方便啊。。。

1. 一维数组和二维数组不能混用:matmul 必须是 二维数组相乘,比如a(10,8)和b(8,1)相乘,b就得在定义的时候定义成b(8,1)而不能像Matlab一样,用一个维数组b(8)就可以。

2. 数组和数值变量:我运算完后表达式结果是一个二维数组1*1维的,就是不能直接赋值给一个单变量。。。必须先定义一个c(1,1)取到值,再做运算

大家有什么好方法或心得吗?

回复列表 (共11个回复)

沙发


2.借用字符变量,用内文件的方法也可以。。。

板凳

matmul我已经很少用了. 翻查了一下matmul的说明, 后面给的例程是可以用于一维数组的.


The following shows another example:

 INTEGER a(2,3), b(3,2), c(2), d(3), e(2,2), f(3), g(2)
 a = RESHAPE((/1, 2, 3, 4, 5, 6/), (/2, 3/))
 !  a is   1 3 5
 !         2 4 6
 b = RESHAPE((/1, 2, 3, 4, 5, 6/), (/3, 2/))
 !  b is   1 4
 !         2 5
 !         3 6
 c = (/1, 2/)      ! c is [1 2]
 d = (/1, 2, 3/)   ! d is [1 2 3]

 e = MATMUL(a, b)    ! returns 22 49
                     !         28 64

 f = MATMUL(c,a)   ! returns [5 11 17]
[color=FF0000] g = MATMUL(a,d) [/color]  ! returns [22 28]
 WRITE(*,*) e, f, g
 END

3 楼

方便性那当然不能够跟matlab比的.

4 楼

[quote]matmul我已经很少用了. 翻查了一下matmul的说明, 后面给的例程是可以用于一维数组的.


The following shows another example:

 INTEGER a(2,3), b(3,2), c(2), d(3), e(2,2), f(3), g(2)
 a = RESHAPE((/1, 2, 3, 4, 5, 6/), (/2, 3/))
 !  a is   1 3 5
 !         2 4 6
 b = RESHAPE((/1, 2, 3, 4, 5, 6/), (/3, 2/))
 !  b is   1 4
 !         2 5
 !         3 6
 c = (/1, 2/)      ! c is [1 2]
 d = (/1, 2, 3/)   ! d is [1 2 3]

 e = MATMUL(a, b)    ! returns 22 49
                     !         28 64

 f = MATMUL(c,a)   ! returns [5 11 17]
[color=FF0000] g = MATMUL(a,d) [/color]  ! returns [22 28]
 WRITE(*,*) e, f, g
 END[/quote]

哦,搞错了,是可以 一维和二维相乘的。。。刚才试了试发现点有意思的规律:
1. 一维和二维相乘,c(2)可以相当于二维的c(1,2)或c(2,1),根据二维矩阵的情况定;例如,matmul(c,a)和matmul(transpose(a),c)都可以。
2. 一维和二维相乘结果是一维数组,但是二维和二维相乘是二维数组,虽然结果是一样的;例如,
matmul(c,a)结果是一维,长度为3,但是如果定义c为(1,2),结果为二维数组,长度是(1,3)
所以以下程序,接收数组ir如果定义为ir(1,1)就报错了。。。
Program test
implicit none
real :: iw(10,1) = 2.0
real :: lw(10) = 3.0
real ir(1)

ir = matmul(lw,iw)
write(*,*) ir

stop
end program test

ps 是啊,平时都不怎么用matmul的。。。

5 楼

以前用matmul比较多, 但后来为了提高效率已经放弃了使用matmul, 之后2年没再用它所以它的特性也忘得差不多了. 那个维度是需要小心处理的地方.

6 楼

[quote]以前用matmul比较多, 但后来为了提高效率已经放弃了使用matmul, 之后2年没再用它所以它的特性也忘得差不多了. 那个维度是需要小心处理的地方.[/quote]

提高效率放弃matmul,怎么讲?

7 楼

楼主可以查一下一个叫BLAS的函数库. 很多软件和函数库的矢量运算是调用它的. 也可以查查这个论坛关于BLAS的旧帖.

8 楼

楼主可以查一下一个叫BLAS的函数库. 很多软件和函数库的矢量运算是调用它的. 也可以查查这个论坛关于BLAS的旧帖.

9 楼

恩,以前看到很多帖子有提到这个函数库,回头研究一下,楼上有什么推荐的资料或者网站吗?谢啦

10 楼

fortran的话可以参考:
fortran_95-2003_for_scientists_and_engineers_3rd_edition
Fortran95_2003_explained
The_Fortran_2003_Handbook__The_Complete_Syntax_Features_and_Procedures (这本可以作为工具书,讲得很细)

关于库(具体要看需要什么计算)和专业方向的书都是到网上或者专业相关的人介绍吧.

我来回复

您尚未登录,请登录后再回复。点此登录或注册