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

时间:2010-05-31 23:47:33

标签: matlab fortran windows-xp intel-fortran

虽然你们中的许多人都会对我的目标有一个不错的认识,但只需阅读标题 - 请允许我简单介绍一下。

我有一个Fortran程序 - 它包含一个程序,一些内部子程序,7个带有自己程序的模块,以及......呃,就是这样。

没有详细说明,因为我认为此时不需要, 使用MATLAB绘图功能最简单的方法(主要是使用一些自定义绘图(x,y))作为我的程序的交互式部分? 目前我正在使用我自己的一些自定义绘图程序(基于HPGL和Calcomp的例程),但作为我演习的一部分,我我想知道这可以去哪里以及它将如何运作(它甚至可能是我建议的吗?)。另外,我需要付出多少努力?

我知道这个主题已在网上的许多“教程”中进行了相当广泛的描述,但由于某种原因,我很难找到真正简单但具有说明性的介绍。所以,如果有人可以发布一两个简单的例子,我会非常感激。或者只需带我一手指导我完成一个工作示例。

平台:IVF 11.something :)在Win XP SP2上,Matlab 2008b

3 个答案:

答案 0 :(得分:4)

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

这有点像kludge,所以你可能想考虑使用Matlab调用Fortran程序(或部分程序)并直接获取数据进行绘图。在这种情况下,您需要在Matlab文档中研究创建Fortran MEX文件。如果您乐意使用Matlab来驱动流程并将Fortran用作计算服务,那么这样做相对简单,可以满足您的需求。我将查看使用Matlab分发的示例,了解简单的Fortran MEX文件。

最后,您可以从Fortran程序中调用Matlab,搜索调用Matlab引擎的文档。对我来说,看看它如何适合你的需求有点困难,而且这不是我非常熟悉的东西。

如果您再次发布更多详细信息,我可能会提供更具体的提示,但您应该开始卷起袖子并潜入MEX文件。

答案 1 :(得分:3)

继续讨论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章。

到目前为止,我一直在做的事情(除了一些“鸭子磁带”解决方案)是

  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来查找数据中的最小值和最大值,而不是编写子例程以向外舍入到“nice”舍入值。类似地,一个子程序来决定刻度线间距。

这实际上并不容易实现(并且很高兴能够提出证明我错误的想法)。或者我应该说,如果你知道你的价值观所处的粗略范围,这很容易。但如果你不这样做,你就不知道了 你的价值是否会在13-34或1330-3440的范围内,那么...

...如果我在这里完全走错了路,请解释一下你是否有不同之处。我的英语有点缺乏,所以我只能希望上面的内容是可以理解的。

在确定圆图开始/结束值的子程序中,您可以将实际的最小/最大值缩放到1到10之间,然后使用表来选择漂亮的圆值,然后将其缩放回正确的范围。

-

答案 2 :(得分:2)

转储Matlab,因为它的专有,昂贵,膨胀/慢速和代码不易并行化。

你应该做的是使用DISLIN,PLplot,GINO,gnuplotfortran等行。