作者pipidog (如果狗狗飞上天)
看板Fortran
标题Re: [问题] fortran 一维矩阵
时间Fri Dec 19 04:19:09 2014
※ 引述《kuang01 (我叫小刘)》之铭言:
: 想请问各位大大
: 在fortran 一维矩阵里
: do i=1,5
: A(i)=2
: enddo
: 这样会是 一colum vector 还是 row vector
: 因为我在matlab里
: 如果把 do 换成for
: 这样去写 会出现 row vector
: 想请问 fortran 的一维跟matlab是否不太一样
底下的人回答大致正确,因为对指标上来说,确实没差别,
但是你有这种问题,甚至刻意的去区别到底一个一维阵
列是row还是column vector也不是坏事.
因为在记忆体的使用上,fortran确实是by column,而C
based的语言,例如C/C++,Matlab,Scilab,Python都是
by row.也就是说,当你往记忆体里面填入一个二维阵
列时,fortran会让同一个column的资料作连续的排列.
因此当你在记忆体里面填值或读值的时候,在fortran应
该要先作column vector,而Matlab,C/C++,Python等应该要
先做row vector,在记忆体的使用上才是连续的读写,不会
一直跳跃.
这个影响还不只是读写效率的问题,那还只是其次的,作
不好顶多效率比较低,但是当你要让by column跟by row
的语言相互传值时,问题才出现.
例如你想在C-based的语言里面使用fortran写成的library,
例如lapack.因为你会把C里面的一块记忆体传到fortran中,
但因为C是将同一个row的资料在记忆体中作连续排列,跟
fortran对记忆体的使用方式刚好相反,所以当你把资料传入
时,fortran在理解这个阵列时,行列都会颠倒了.所以当你要
把C里面的值传到fortran时,往往需要先转秩才能传入.反之
亦然.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 168.150.122.1
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Fortran/M.1418933953.A.2EE.html
1F:→ gilocustom: Matlab是column-major。 12/19 17:57
2F:→ gilocustom: 话说虽然一般认知都当做Fortran是column-major,但是 12/19 17:58
3F:→ gilocustom: 在标准书中似乎没有此规范,会是约定俗成或是取决於 12/19 17:58
4F:→ gilocustom: 实做吗? 12/19 17:59
5F:→ wenni: 是因为Fortran实际存array记忆体是以colume major方式去存 12/19 23:23
6F:→ wenni: 所以才会特别这样说 也因此在做do-loop时先column效能较好 12/19 23:24
7F:→ gilocustom: 请问楼上:你所谓的「实际」是指标准就有明文规定吗? 12/20 02:18
8F:→ pipidog: 不是约定成俗,你让他跟c互传资料就会发现有问题了。 12/20 02:19
9F:推 gilocustom: 若既不在标准规范内,且亦非约定俗成(又名:历史包袱) 12/20 02:51
10F:→ gilocustom: ,则代表有些编译器可能是column-major,有些则可能是 12/20 02:52
11F:→ gilocustom: row-major,意即某些编译器的Fortran与C沟通时即便不 12/20 02:53
12F:→ gilocustom: 转置也不会有资料错置的状况(假设C规范是row-major)。 12/20 02:53
13F:→ gilocustom: 我了解本文的意思,我一直以来也都是这麽被告知的, 12/20 03:05
14F:→ gilocustom: 我好奇的是这说法究竟是人云亦云,还是明文规定? 12/20 03:05
15F:推 kkarthur: 判断是否column-major可以写只小程式计算运行的时间 12/24 18:00
16F:→ kkarthur: 就可以很快地看出差异,不过现在的compiler都有最佳化 12/24 18:00
17F:→ kkarthur: 直接用预设的选项去编译程式是看不出来差异的 12/24 18:01
18F:→ kkarthur: 可以额外加上把最佳化关掉的指令,就可以看出差异来 12/24 18:02