4

尽管你们中的许多人都会对我的目标有一个不错的想法,但仅从标题来看——请允许我做一个简单的介绍。

我有一个 Fortran 程序——它由一个程序、一些内部子程序、7 个带有自己的程序的模块组成,而且……嗯,就是这样。

无需赘述,因为我认为此时没有必要,将 MATLAB 的绘图功能(主要是带有一些自定义的 plot(x,y) )作为我程序的交互部分使用的最简单方法是什么?现在我正在使用一些我自己的自定义绘图例程(基于 HPGL 和 Calcomp 的例程),但作为我练习的一部分,我想看看它可以去哪里以及它是如何工作的(是它甚至可能是我的建议?)。另外,我需要付出多少努力?

我知道这个主题已经在网上的许多“教程”中得到了相当广泛的描述,但由于某种原因,我很难找到真正简单但说明性的介绍性的。因此,如果有人可以发布一两个简单的示例,我将不胜感激。或者只是牵着我的手,指导我完成一个工作示例。

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

4

3 回答 3

4

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

不过这有点麻烦,所以您可能想考虑使用 Matlab 调用 Fortran 程序(或其中的一部分)并直接获取数据以进行绘图。在这种情况下,您需要研究Matlab 文档中的创建 Fortran MEX 文件。如果您乐于使用 Matlab 来驱动流程并使用 Fortran 作为计算服务,这相对简单,并且可以满足您的需求。我会在 Matlab 分发的示例中查看简单的 Fortran MEX 文件。

最后,您可以从您的 Fortran 程序中调用 Matlab,搜索Calling the Matlab Engine的文档。对我来说,要了解这如何满足您的需求有点困难,而且我对此并不十分熟悉。

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

于 2010-06-01T08:34:32.540 回答
3

继续讨论 DISLIN 作为解决方案,答案不适合评论...

@MSB - 你好。我很抱歉写你的答案,但这些评论太短了,以答案的形式回答问题是......无论如何......

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

是的,我知道 Quickplot,它是相关的例程,但它对于我的需要来说太固定了(不能改变任何东西),是的,它的自动缩放有点古怪。此外,格拉夫内部的利润太大。

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

你试过套路吗?

抱歉,我在 dislin 的索引中找不到您要引用的 GAXPAR 例程。你确定它是这样称呼的吗?

MSB 回复: 是的,我确定 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 之间,然后有一个表格来选择漂亮的圆形值,然后取消缩放回正确的范围。

--

于 2010-06-02T04:04:41.700 回答
2

转储 Matlab,因为其专有、昂贵、臃肿/缓慢且代码不易并行化。

你应该做的是在 DISLIN、PLplot、GINO、gnuplotfortran 等行中使用一些东西。

于 2010-06-01T22:08:28.607 回答