Re: [问题] fortran 一维矩阵

楼主: pipidog (如果狗狗飞上天)   2014-12-19 04:19:09
※ 引述《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时,往往需要先转秩才能传入.反之
亦然.
作者: gilocustom   2014-12-19 17:57:00
Matlab是column-major。话说虽然一般认知都当做Fortran是column-major,但是在标准书中似乎没有此规范,会是约定俗成或是取决于实做吗?
作者: wenni   2014-12-19 23:23:00
是因为Fortran实际存array内存是以colume major方式去存所以才会特别这样说 也因此在做do-loop时先column效能较好
作者: gilocustom   2014-12-20 02:18:00
请问楼上:你所谓的“实际”是指标准就有明文规定吗?
楼主: pipidog (如果狗狗飞上天)   2014-12-20 02:19:00
不是约定成俗,你让他跟c互传资料就会发现有问题了。
作者: gilocustom   2014-12-20 02:51:00
若既不在标准规范内,且亦非约定俗成(又名:历史包袱),则代表有些编译器可能是column-major,有些则可能是row-major,意即某些编译器的Fortran与C沟通时即便不转置也不会有资料错置的状况(假设C规范是row-major)。我了解本文的意思,我一直以来也都是这么被告知的,我好奇的是这说法究竟是人云亦云,还是明文规定?
作者: kkarthur (aa)   2014-12-24 18:00:00
判断是否column-major可以写只小程式计算运行的时间就可以很快地看出差异,不过现在的compiler都有最佳化直接用默认的选项去编译程式是看不出来差异的可以额外加上把最佳化关掉的指令,就可以看出差异来

Links booklink

Contact Us: admin [ a t ] ucptt.com