获取一个列表的第i个排列组合
我需要一个fortran代码来计算给定列表{1,2,3,...,n}的ITH置换,而无需计算所有排列,即n!. 有人可以帮助我吗?预先感谢您. 解决方案 对于大数字,以下实现保留了溢出错误. ! Fattoriale RECURSIVE FUNCTION factorial(n) RESULT(n_factorial) IMPLICIT NONE REAL, INTENT(IN) :: n REAL :: n_factorial IF(n>0) THEN n_factorial=n*factorial(n-1) ELSE n_factorial=1 ENDIF ENDFUNCTION factorial ! ith-permutazione di una lista
0 2023-05-25
编程技术问答社区
创造所有可能组合的算法
我正在编写备件网格代码,需要将n个1维网格点(以向量形式编写)结合到所有可能点的数组中.例如,一个可以将两个向量(a,b)与(c,d,e)混合在一起,给出以下几点: (a,c)(a,d)(a,e) (b,c)(b,d)(b,e) matlab具有称为combvec的函数: http://www.mathworks.co.uk/help/nnet/ref/combvec.html 我正在用fortran编写此代码,但是我找不到基础算法.该代码需要接收n(n> 1)向量(即2,3 ... n),每个向量可以是不同的长度.有人知道算法吗? 解决方案 我不知道Fortran,但是由于您说您找不到基础算法,因此我假设您一旦知道算法就可以自己写这篇文章.实际上很容易.伪代码将是这样的(假设没有重复项): index = 0 ! or 1 for each element in first vector for each element in seco
2 2023-05-25
编程技术问答社区
在mac OSX上使用gfortran读取免费提供的UVR数据
我想使用fortran阅读日本航空航天勘探局已经生产的紫外线辐射数据.该数据是在2000 - 2010年以约5 km的空间分辨率下进行的每日和每月时间分辨率.这个问题值得回答,因为数据可能对许多环境/健康项目很有用,并且可以免费获得,并适当确认源头和随后出版物的预印本的共享,来自以下情况: /pub/gli/glical/global_05km/honerly/uvb/ 有一个可用的注册文件,该文件提供了有关如何使用FORTRAN读取数据的说明: : _le文件的说明 标题 Read header (size= pixel size *2byte): character head*14400 read(10,rec=1) head read(head,'(2i6,2f8.2,f8.4,2e12.5,a1,a8,a1,a40)') & npixel,nline,lon_min,lat_max,reso,slope,offset,',',
0 2023-05-25
编程技术问答社区
与其他语言相比,Fortran在数值精度上是否有固有的限制?
在进行简单的编程练习时,我制作了一个时循环(在fortran中进行循环),该循环是在真正变量达到精确值时退出的. 我注意到,由于使用的精度,从未达到平等,循环变得无限.当然,这不是闻所未闻的,并且建议一个人不要比较两个数字的平等,而是最好看看两个数字之间的绝对差异是否小于设定的阈值. 我发现令人失望的是,即使变量以双重精度,我必须设置这个阈值有多低,以使我的循环正确退出.此外,当我在perl中重写此循环的"蒸馏"版本时,我没有数值准确性的问题,并且循环恢复正常. 由于在Perl和Fortran中,产生问题的代码很小,因此我想在这里重现它,以防我掩盖了一个重要的细节: fortran代码 PROGRAM precision_test IMPLICIT NONE ! Data Dictionary INTEGER :: count = 0 ! Number of times the loop has iterated REAL(KIND=8) :: veloc
0 2023-05-24
编程技术问答社区
为Fortran多线程程序计时
我有一个fortran 90程序,调用多线程例程.我想从呼叫例程中加入此程序.如果我使用cpu_time(),我最终会为所有线程(在我的情况下)添加的所有线程(8)而不是程序运行所需的实际时间. etime()例程似乎也这样做.关于我如何计时此程序的时间(不使用秒表)? 解决方案 尝试omp_get_wtime();参见 >用于签名. 其他解决方案 如果这是一次性的事情,那么我同意Larsmans的观点,即使用Gprof或其他一些分析可能是必经之路.但是我也同意,在您的代码中使用更粗的计时器来定时计算的不同阶段是非常方便的.您拥有的最好的计时信息是您实际使用的东西,很难击败每个运行代码的每个tiem输出的东西. 耶利米亚·威尔科克(Jeremia Wilcock)指出omp_get_wtime()非常有用;它符合标准,因此在任何OpenMP编译器上都应该使用 - ,但仅具有第二个分辨率,这可能是或不够的,具体取决于您的工作. 编辑;以上是完全错误的. fort
2 2023-05-24
编程技术问答社区
同时执行多个进程时,速度急剧下降
我编写了一个非常简单的代码,其中包含使用Fortran和Python的数组求和.当我使用Shell提交多个(独立的)作业时,当线程数大于一个时,将会有巨大的减速. 我的代码的fortran版本如下 显示 program main implicit none real*8 begin, end, Ht(2, 2), ls(4) integer i, j, k, ii, jj, kk integer,parameter::N_tiles = 20 integer,parameter::N_tilings = 100 integer,parameter::max_t_steps = 50 real*8,dimension(N_tiles*N_tilings,max_t_steps,5)::test_e, test_theta real*8 rand_val call random_seed() do i = 1, N_tiles*N_tilings do j = 1, max_
0 2023-05-24
编程技术问答社区
为什么我的F2py程序比Python程序慢?
我最近与Python一起编写了一个耗时的计划,并决定使用Fortran重写最耗时的部分. 但是,用f2py包裹的fortran代码比python代码慢,有人可以告诉我如何找到这里发生的事情吗? 供参考,这是python函数: def iterative_method(alpha0, beta0, epsilon0, epsilons0, omega, smearing=0.01, precision=0.01, max_step=20, flag=0): # alpha0, beta0, epsilon0, epsilons0 are numpy arrays m, n = np.shape(epsilon0) Omega = np.eye(m, dtype=np.complex) * (omega + smearing * 1j) green = LA.inv(Omega - epsilon0) # LA is numpy.linalg
0 2023-05-24
编程技术问答社区
内部功能的表现
是否有任何理由相信fortran内部功能会比外部功能更好? ,例如 subroutine foo(x,y) real :: x x = bar(y) return contains real function bar(x) real :: x bar = x*x return end function bar end subroutine foo vs subroutine foo(x,y) real :: x real :: bar x = bar(y) return end subroutine foo real function bar(x) real :: x bar = x*x return end function bar 例如,内部单元是否允许编译器像某种宏一样嵌入该代码? 解决方案 我不认为有任何一般原因相信fortran内
0 2023-05-24
编程技术问答社区
在分配的矢量中插入一个改变形状的值 fortran
我想问您有关使用Fortran的CSR/CSC*矩阵管理中经常遇到的问题. 假设我们有一个具有n个真实值的向量V.先前已经以一定大小分配了矢量.现在,我们必须在索引中的中间添加一个值. 蛮力代码将是: allocate(tempV(N)) tempV=V deallocate(V) allocate(V(N+1)) V=(/tempV(1:P-1), newValue, tempV(P:N)/) deallocate(tempV) 显然,如果完成后,这不是问题,但是重复数千次不会那么有效.内存会填充和空的4倍我想插入的每个值. 我想知道哪个是解决此问题的更好程序.您可以提出普通的Fortran(首选),也可以通过MKL/Lapack/Blas等图书馆进行一些解决方案. 附录:我可以用重塑做到吗?通过REAL, DIMENSION(1:1) :: newPad = (/ newValue /) V=RESHAPE(V, (/ N+1 /), PAD=newPad)
0 2023-05-24
编程技术问答社区
为什么我使用OpenMP Atomic的并行代码比串行代码需要更长的时间?
我的串行代码片段如下所示. Program main use omp_lib Implicit None Integer :: i, my_id Real(8) :: t0, t1, t2, t3, a = 0.0d0 !$ t0 = omp_get_wtime() Call CPU_time(t2) ! ------------------------------------------ ! Do i = 1, 100000000 a = a + Real(i) End Do ! ------------------------------------------ ! Call CPU_time(t3) !$ t1 = omp_get_wtime() ! ------------------------------------------ ! Write (*,*) "a = ", a
0 2023-05-24
编程技术问答社区
是什么导致了这段微不足道的fortran代码的运行时间差异?
我在这个琐碎的程序中观察到非常奇怪的效果 module Moo contains subroutine main() integer :: res real :: start, finish integer :: i call cpu_time(start) do i = 1, 1000000000 call Squared(5, res) enddo call cpu_time(finish) print '("Time = ",f6.3," seconds.")',finish-start end subroutine subroutine Squared(v, res) integer, intent(in) :: v integer, intent(out) :: res res = v*v
2 2023-05-24
编程技术问答社区
在Fortran中对若干矩阵进行加权求和的最有效方法
我正在尝试在Fortran中编写一个函数,该功能乘以许多具有不同权重的矩阵,然后将它们添加在一起形成一个单个矩阵.我已经确定这个过程是我程序中的瓶颈(对于单个程序的单个运行,将使此权重进行多次,并且权重不同).现在,我试图通过从MATLAB切换到Fortran来使其更快地运行.我是Fortran的新手,所以我感谢所有的帮助. 在matlab中,我发现这样的计算看起来像这样的最快方式: function B = weight_matrices() n = 46; m = 1800; A = rand(n,m,m); w = rand(n,1); tic; B = squeeze(sum(bsxfun(@times,w,A),1)); toc; 在我的机器上大约0.9秒内分配B的线(Matlab R2012B,MacBook Pro 13" Retina,2.5 GHz Intel Core i5,8 GB 1600 MHz DDR3).应该指出的是,我的问题应该指出,张量A
0 2023-05-24
编程技术问答社区
普通数组与可分配/指针数组,Fortran建议?
我为矩阵乘法写了以下人为的示例,只是为了检查声明不同类型的数组如何影响性能.令我惊讶的是,我发现声明时具有已知尺寸的普通阵列的性能不如可分配/指针阵列.我以为allocatable仅对于不适合堆栈的大阵列才需要.这是使用GFORTRAN和Intel Fortran编译器的代码和时间. Windows 10平台分别与编译器标志-Ofast和-fast一起使用. program matrix_multiply implicit none integer, parameter :: n = 1500 real(8) :: a(n,n), b(n,n), c(n,n), aT(n,n) ! plain arrays integer :: i, j, k, ts, te, count_rate, count_max real(8) :: tmp ! real(8), allocatable :: A(:,:), B(:,
2 2023-05-24
编程技术问答社区
矩阵的主要行与主要列布局
在编程密集的矩阵计算中,是否有任何理由选择列列的行分段布局? 我知道,根据所选矩阵的布局,我们需要编写适当的代码以有效地使用缓存记忆来速度. 行 - 马约尔的布局似乎更自然,更简单(至少对我来说).但是用fortran编写的主要图书馆使用列的主要布局,因此必须有一些理由做出此选择. 解决方案 Fortran旨在解决科学和工程问题.从科学的角度来看,列尺寸的存储更自然,因为通用线性代数惯例使用列矢量,并且经常将矩阵视为列矢量的串联.在矩阵矢量乘法中,列矢量位于右侧(后刺后),连续的矩阵在左侧进一步添加,例如B*(A*x).诸如Cobol,PL/1和C之类的语言将矩阵视为排名录制的集合,因此对它们的行订单更自然. 在线性代数中,向量由其坐标表示:x = x[1]*e1 + x[2]*e2 + ... + x[n]*en其中x[i]是向量坐标,而ei是i i th Basit向量.在矩阵表示中,基础向量是列向量.然后,线性运算符A,然后作用于x,给出: y =
0 2023-05-23
编程技术问答社区
通过重构if语句/do循环来避免重复的代码
嗨,我试图在网格中许多不同的空间点上对我的功能施加特定条件.但是,我正在复制大量代码,并且效率越来越低. 我如何通过简单地使用do循环来做我需要做的事情?我试图在所有不同的空间点上强加于我的功能的特定条件是相同的,因此我认为有一种在单个环中完成所有这些的方法.或者,如果语句纳入单个语句,我该如何将所有这些组合在一起? 必须有一种比我正在做的更有效的方法. 我在下面提供了一个示例代码. FUNCTION grad(psi) IMPLICIT NONE INTEGER :: i,j,kk,ll INTEGER, PARAMETER :: nx = 24, ny = 24 COMPLEX,DIMENSION(3,3,-nx:nx, -ny:ny) :: psi, grad REAL :: pi REAL :: f0 INTEGER :: nxx, nyy nxx = nx/2 nyy = ny/2 pi = 4*atan(1.0) f0 = pi**2*1.3 DO
2 2023-05-23
编程技术问答社区
提高Fortran代码性能的技巧和窍门
作为我博士学位的一部分研究,我正在研究大气和海洋循环的数值模型.这些涉及在〜10^6个网格点上的数值求解系统,超过〜10^4的时间步长.因此,典型的模型模拟需要数小时到几天才能完成在MPI上进行数十次CPU.自然地,尽可能提高模型效率很重要,同时确保结果是相同的. 虽然我对自己的fortran编程感到很满意,并且意识到使代码更有效的技巧,但我觉得仍然有改进的空间,我不知道的技巧. 目前,我确保我使用尽可能少的部门,并尽量不要使用文字常数(我很早就被教导要这样做,例如,在实际计算中使用半= 0.5而不是0.5),将其用作很少有先验功能等等. 还有哪些其他绩效敏感因素?目前,我想知道一些: 1)数学操作的顺序是否重要?例如,如果我有: a=1E-7 ; b=2E4 ; c=3E13 d=a*b*c d会根据乘法的顺序以不同的效率评估吗?如今,这必须是针对编译器的,但是有直接的答案吗?我注意到D基于顺序(精度限制)获得(略有不同的)值,但这会影响效率吗?
4 2023-05-23
编程技术问答社区
比较python和c/fortran
我编写了以下程序,以将Python的速度与C/Fortran进行比较. 为了获取程序使用的时间,我使用了"时间"命令.一切 程序计算x x+y y+z*z的平方根,其中x,y,z是浮子. 我使用了根广场,因为它是最耗时的零件之一 我参与的科学计算. 我有以下时间: fortran 0m29.9s // c 0m20.7s // python 30m10.8s 根据简单的测试,我发现不建议使用Python 科学计算.但可能我的代码效率很低. 您认为我可以为这个简单的测试案例提高代码效率吗? fortran: program root_square implicit none integer i,j real x,y,z,r x=1.0 y=2.0 z=3.0 do j=1,3000 do i=1,1000000 r=sqrt(x*x+y*y+z*z) enddo enddo end program
0 2023-05-23
编程技术问答社区
R: 使用带有.Call和C/C++包装器的Fortran子程序而不是.Fortran的优势?
i有一个R软件包,该软件包使用大量的fortran子例程进行递归线性代数计算的嵌套环(取决于Blas和Lapack例程).作为Fortran的接口,我使用.Fortran函数.我刚刚阅读 Jonathan Callahan的博客文章C ++,这让我想到使用.Call在使用FORTRAN子例程时也可以通过在C中编写一个简单的包装器,然后称为Fortran子例程? 正如所说,我的fortran代码很简单,从某种意义上说,我只是使用多维阵列的双重或整数.但是我了解到,我必须在r侧写很多检查,以确保一切都不会崩溃,因为我不小心忘记将某些矩阵的存储模式更改为整数或某些矩阵的尺寸./p> 子例程写为F90/95. 解决方案 如果您正在使用大型数据集,则可能会有优势. .CALL可以更快得多,因为您每次调用该函数时都不会复制数据.对于此问题中描述的情况,将没有这样的优势,因为r 2.15.1发行说明状态 .c()和.fortran()做较少的复制:原始的,逻辑,整数,真实或复杂的
2 2023-05-23
编程技术问答社区
Fortran矩阵运算的性能
我需要使用fortran而不是在某个地方使用C,我是Fortran的新手.我正在尝试进行一些大型计算,但是与C相比,这很慢(可能是10倍或更多,并且我都使用英特尔的编译器.我认为原因是Fortran将矩阵保持在列的主要格式中,我正在尝试进行操作(矩阵(i,j,:)),因为它是专栏的专业,这可能是非常效率的(可能不是)完全使用).但是,我不确定这是否是实际原因(因为我对Fortran的了解少).问题是,Fortran中的约定是在列向量而不是行向量上进行操作? (顺便说一句:我检查了已经使用Intel的Lapack库的FORTRAN的速度,并且非常快,因此它与任何编译器或构建问题无关.) 谢谢. mete 解决方案 尝试在执行矩阵操作时更改循环的顺序,例如如果您在C中有类似的东西: for (i = 0; i
4 2023-05-23
编程技术问答社区
Fortran中的If或函数指针
由于Fortran非常普遍,我正在编写一个非常平行的科学代码.在代码的开头,我读取了我的配置文件,该文件告诉我要使用哪种求解器.现在,这意味着在子例程中(在主跑期间)我有 if(solver.eq.1)then call solver1() elseif(solver.eq.2)then call solver2() else call solver3() endif 编辑以避免某种混乱:如果在我的时间集成循环中,我有一个在3个嵌套循环中. 现在,我的问题是,使用功能指针更有效,因为solver变量在执行过程中不会更改,除非在初始化过程中. . 显然功能指针为F2003.只要我使用GFORTRAN 4.6,那就不是问题.但是我主要是在使用蓝gene P,有一个F2003编译器,所以我想它也可以在那里工作,尽管我在网上找不到任何结论性证据. 解决方案 对Fortran一无所知,这是我的答案:分支的主要问题是CPU可能无法投机在其上执行代码.为了减
0 2023-05-23
编程技术问答社区