主题:[讨论]FORTRAN 数组运算不方便啊。。。
heizaoniangao
[专家分:310] 发布于 2013-01-23 07:04:00
以前编程没用到多少数组运算,今天试了试,真是没MATLAB方便啊。。。
1. 一维数组和二维数组不能混用:matmul 必须是 二维数组相乘,比如a(10,8)和b(8,1)相乘,b就得在定义的时候定义成b(8,1)而不能像Matlab一样,用一个维数组b(8)就可以。
2. 数组和数值变量:我运算完后表达式结果是一个二维数组1*1维的,就是不能直接赋值给一个单变量。。。必须先定义一个c(1,1)取到值,再做运算
大家有什么好方法或心得吗?
回复列表 (共11个回复)
沙发
heizaoniangao [专家分:310] 发布于 2013-01-23 07:16:00
2.借用字符变量,用内文件的方法也可以。。。
板凳
yeg001 [专家分:14390] 发布于 2013-01-23 13:17:00
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 楼
yeg001 [专家分:14390] 发布于 2013-01-23 13:21:00
方便性那当然不能够跟matlab比的.
4 楼
heizaoniangao [专家分:310] 发布于 2013-01-23 14:49:00
[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 楼
yeg001 [专家分:14390] 发布于 2013-01-23 15:20:00
以前用matmul比较多, 但后来为了提高效率已经放弃了使用matmul, 之后2年没再用它所以它的特性也忘得差不多了. 那个维度是需要小心处理的地方.
6 楼
heizaoniangao [专家分:310] 发布于 2013-01-23 15:39:00
[quote]以前用matmul比较多, 但后来为了提高效率已经放弃了使用matmul, 之后2年没再用它所以它的特性也忘得差不多了. 那个维度是需要小心处理的地方.[/quote]
提高效率放弃matmul,怎么讲?
7 楼
yeg001 [专家分:14390] 发布于 2013-01-23 21:44:00
楼主可以查一下一个叫BLAS的函数库. 很多软件和函数库的矢量运算是调用它的. 也可以查查这个论坛关于BLAS的旧帖.
8 楼
yeg001 [专家分:14390] 发布于 2013-01-23 21:44:00
楼主可以查一下一个叫BLAS的函数库. 很多软件和函数库的矢量运算是调用它的. 也可以查查这个论坛关于BLAS的旧帖.
9 楼
heizaoniangao [专家分:310] 发布于 2013-01-24 02:46:00
恩,以前看到很多帖子有提到这个函数库,回头研究一下,楼上有什么推荐的资料或者网站吗?谢啦
10 楼
yeg001 [专家分:14390] 发布于 2013-01-24 10:12:00
fortran的话可以参考:
fortran_95-2003_for_scientists_and_engineers_3rd_edition
Fortran95_2003_explained
The_Fortran_2003_Handbook__The_Complete_Syntax_Features_and_Procedures (这本可以作为工具书,讲得很细)
关于库(具体要看需要什么计算)和专业方向的书都是到网上或者专业相关的人介绍吧.
我来回复