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

4
尽管从标题中就能大致了解我的目的,但我还是想进行简单的介绍。我有一个Fortran程序——它包括一个程序、一些内部子程序、7个具有自己过程的模块,以及...嗯,就这些。不详细说明,因为我认为这在此时并不必要。那么,在不涉及太多细节的情况下,最简单的方法是什么,可以使用MATLAB的绘图功能(主要是plot(x,y)和一些自定义)作为我的程序的交互部分?现在我正在使用一些我自己的自定义绘图例程(基于HPGL和Calcomp的例程),但只是作为我的一部分练习,我想看看这可能会发展到什么程度以及如何工作(我所建议的甚至可能吗?)。另外,我需要付出多少努力呢?我知道这个主题已经在网络上的许多“教程”中得到了相当广泛的描述,但由于某种原因,我很难找到真正简单而富有启发性的入门教程。如果有人能发布一个或两个简单的示例,我将不胜感激。或者就给我提供一个可行的工作示例吧。平台:IVF 11.something :) on Win XP SP2,Matlab 2008b。
3个回答

4
最简单的方法是让你的Fortran程序将信息写入文件,然后让你的Matlab程序读取这些文件以获取你想要绘制的信息。我在Linux上进行大部分数字计算,因此不太确定Windows如何处理一个进程同时写入文件和另一个进程读取文件的情况。
但这种方法有点笨拙,所以你可能需要考虑使用Matlab调用Fortran程序(或其中的某些部分)并直接获取数据以进行绘图。在这种情况下,你需要查阅Matlab文档中的“创建Fortran MEX文件”。这相对来说比较容易做到,并且如果你愿意使用Matlab驱动进程并使用Fortran作为计算服务,则可以满足你的需求。我建议在Matlab中查找简单的Fortran MEX文件示例。
最后,你可以从你的Fortran程序中调用Matlab,请在文档中搜索“调用Matlab引擎”。我不太清楚这如何适应你的需求,也不太熟悉这个功能。
如果你再提供更多详细信息,我可能能够提供更具体的提示,但你应该开始深入研究MEX文件。

对不起,这就是在疲倦时写问题的结果。你是对的 - 应该是“从Matlab调用Fortran”...来进行计算,然后使用Matlab的功能进行绘图。 - Rook

3

继续讨论DISLIN作为解决方案的问题,由于答案太长而无法放在评论里...

@M. S. B. - 你好。我很抱歉在你的回答中写评论,但这些评论太短了,用回答的形式回答一个问题是...不管怎样...

有DISLIN的快速绘图功能--例程QPLOT只需要三个参数来绘制曲线:X数组、Y数组和数字N。请参阅手册的第16章。此外,只需几个额外的调用来选择输出设备并标记轴。我没有使用过它,所以我不知道自动缩放效果如何。

是的,我知道Quickplot及其相关例程,但对我的需求来说它太固定了(不能更改任何内容),而且它的自动缩放有点古怪。此外,图表内边距太大。

或者,如果您想利用GRAF设置您的图形框,可以使用子程序GAXPAR自动生成推荐值。 LABDIG的第一个参数为-2会自动确定刻度标签中数字的位数。

您尝试过这些例程吗?

抱歉,我在dislin的索引中找不到您提到的GAXPAR例程。您确定它的名称完全是这样吗?

M.S.B.的回复:是的,我确定GAXPAR的拼写。它在DISLIN 9.5 PDF手册的第4章中是最后一个例程。也许它是一个新例程?此外,还有另一种自动缩放的方法:SETSCL--请参阅第6章。

到目前为止,除了一些“鸭子胶带”解决方案之外,我一直在做的是

  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之间,然后有一个表格选择好看的圆形值,然后再将其还原到正确的范围。

--


@ 致 M.S.B. 的回复:是的,我对拼写很确定... ***** 我道歉。它确实在印刷手册中 - 不幸的是,在我阅读的在线手册索引中没有出现,原因不明。无论如何,尽管它似乎在数字方面有些怪异,但它比我迄今想到的任何替代方案都要好。暂时就这样吧。谢谢 M.S.B. - Rook

2
放弃使用Matlab,因为它是专有软件、昂贵、臃肿/速度慢且代码不易并行化。
你应该使用类似DISLIN、PLplot、GINO、gnuplotfortran等的工具。

关于生成图形的其他方式,您可以完全在Fortran中进行,因为提供了Fortran接口。 DISLIN是免费的($)用途广泛且易于安装和使用。它有出色的文档。PLplot是免费($)和开源的,易于使用。文档很好但不完美。根据您的操作系统,安装可能不那么容易。我对其他产品没有经验。 - M. S. B.
你知道如何在dislin中获得某种自动缩放吗?如果我能做到这一点,我就不需要这些东西的一半了。 - Rook
@M. S. B. - 实际上,我正在使用DISLIN,并且非常满意。唯一的问题是自动缩放,我还没有能够令人满意地解决它。你能提供一些关于这方面的技巧吗? - Rook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接