代码之家  ›  专栏  ›  技术社区  ›  Rook

使用matlab的绘图功能作为Fortran程序的交互部分

  •  4
  • Rook  · 技术社区  · 14 年前

    尽管你们中的许多人会对我的目标有一个很好的了解,只是从阅读标题开始——还是让我简单介绍一下。

    我有一个fortran程序-它由一个程序、一些内部子程序、7个模块和它自己的程序组成,以及…嗯,就是这样。

    没有太多的细节,因为我认为在这一点上没有必要, 使用Matlab的绘图功能(主要是带有一些自定义的绘图(x,y))作为程序的交互部分,最简单的方法是什么? 目前,我正在使用我自己的一些自定义绘图程序(基于hpgl和calcomp的程序),但作为我的一个练习的一部分,我想看看这可以去哪里,如何工作(这是否可能是我建议的?)另外,我要付出多少努力?

    我知道这个主题在网络上的许多“教程”中有相当广泛的描述,但是出于某种原因,我很难找到真正简单但有说明性的介绍性主题。所以如果有人能举一两个简单的例子,我会非常感激的。或者就拿着我的手,引导我完成一个工作示例。

    平台:ivf 11.something:)on win xp sp2,matlab 2008b

    3 回复  |  直到 10 年前
        1
  •  3
  •   M. S. B.    14 年前

    继续讨论dislin作为一个解决方案,并给出一个不适合评论的答案…

    @M.S.B.-你好。我很抱歉在你的回答中写到,但是这些评论太短了,以回答的形式回答问题是…总之…

    dislin有一个快速的绘图特性——例程qplot只需要三个参数就可以绘制一条曲线:x数组、y数组和n号。参见手册第16章。再加上几个额外的调用来选择输出设备和标记轴。我没有用过这个,所以我不知道自动缩放有多好。

    是的,我知道QuickPlot,它是相关的例程,但是它对于我的需求来说太固定了(不能改变任何东西),而且是的,它的自动缩放有点奇怪。另外,涂鸦内部的空白太大。

    或者,如果您想使用graf的强大功能来设置图形框,那么有一个子例程gaxpar来自动生成建议的值。-2作为labdig的第一个参数,自动确定刻度线标签中的位数。

    你试过常规程序了吗?

    抱歉,我在dislin的索引中找不到您要引用的gaxpar例程。你确定这个名字和那个完全一样吗?

    M.S.B.的回答 :是的,我对gaxpar的拼写有把握。这是dislin 9.5 pdf手册第4章中的最后一个例程。也许这是一个新的惯例?另外还有一种自动缩放的方法:setscl——见第6章。

    到目前为止,我所做的(除了一些“duck tape”解决方案)是

      use dislin; implicit none
    
      real, dimension(5) :: &
      x = [.5, 2., 3., 4., 5.], &
      y = [10., 22., 34., 43., 15.]
      real :: xa, xe, xor, xstp, &
              ya, ye, yor, ystp
      call setpag('da4p'); call metafl('xwin');
      call disini(); call winkey('return');
    
      call setscl(x,size(x),'x'); 
      call setscl(y,size(y),'y')
    
      call axslen(1680,2376) !(8/10)*2100 and 2970, respectively
      call setgrf('name','name','line','line')
    
      call incmrk(1); call hsymbl(3);
    
      call graf(xa, xe, xor, xstp, ya, ye, yor, ystp); call curve(x,y,size(x))
      call disfin()
    
      end
    

    这将把极端值放在轴上。你知道吗,也许我怎么能在外面有一个“主要的刻度线”,在曲线和轴之间放置一些区域(同时仍然保持setscl的效果)?

    即使您不喜欢内置的自动缩放,如果您已经使用dislin,滚动您自己的自动缩放将比从matlab调用fortran更容易。您可以使用fortran内部函数minval和maxval来查找数据中的最小值和最大值,而不是编写一个子例程向外取整为“漂亮”的取整值。类似地,决定刻度线间距的子程序。

    这其实不是那么容易做到的(而且证明我错了的想法会得到很好的赞赏)。或者我应该说,如果你知道你的价值观所处的大致范围,这很容易。但如果你不知道,你也不知道 无论您的值是在13-34范围内还是在1330-3440范围内,那么…

    …如果我完全走错了方向,请解释一下,如果你有什么不同。我的英语有点欠缺,所以我只能希望上面的内容可以理解。

    在子例程中,要确定圆图的起始/结束值,可以将实际的最小/最大值缩放为始终介于1和10之间,然后有一个表来选择好的圆值,然后取消缩放到正确的范围。

    ——

        2
  •  4
  •   High Performance Mark    14 年前

    最简单的方法是让您的Fortran程序写入文件,并让您的matlab程序读取这些文件以获取您想要绘制的信息。我在Linux上处理大部分的数字运算,所以我不完全确定Windows是如何处理一个进程同时写入文件和读取文件的。

    不过,这有点笨拙,所以您可能需要考虑使用matlab来调用fortran程序(或其部分),并直接获取用于绘图的数据。在这种情况下,你需要调查 创建Fortran MEX文件 在matlab文档中。如果您愿意使用matlab来驱动进程,并使用fortran作为计算服务,那么这是相对简单的,并且可以满足您的需求。我将在用matlab发布的示例中查找简单的fortran mex文件。

    最后,您可以从fortran程序调用matlab,在文档中搜索 调用matlab引擎 . 这对我来说有点困难,因为我不太熟悉这一点。

    如果你再发一篇更详细的文章,我可能会提供更具体的提示,但你可能应该开始卷起袖子,潜入MEX文件。

        3
  •  2
  •   rusi.pathan    14 年前

    转储matlab是因为它的专有、昂贵、膨胀/缓慢和代码不容易并行化。

    你应该做的是在dislin、plplplot、gino、gnuplotfortran等行中使用一些东西。