Использование функций построения графиков MATLAB в качестве интерактивной части программы на Фортране - PullRequest
4 голосов
/ 01 июня 2010

Хотя многие из вас будут иметь приличное представление о том, к чему я стремлюсь, просто прочитав заголовок - позвольте мне еще простое введение.

У меня есть программа на Фортране - она ​​состоит из программы, некоторых внутренних подпрограмм, 7 модулей со своими собственными процедурами и ... хм, вот и все.

Не вдаваясь в подробности, поскольку я не думаю, что в данный момент это необходимо, , что было бы самым простым способом использовать возможности построения графиков в MATLAB (в основном, plot (x, y) с некоторыми настройками) как интерактивная часть моей программы? На данный момент я использую некоторые из моих собственных пользовательских процедур построения графиков (на основе процедур HPGL и Calcomp), но просто как часть упражнения с моей стороны, я бы хотел бы посмотреть, куда это может пойти и как это будет работать (возможно ли даже то, что я предлагаю?). Кроме того, сколько усилий это займет с моей стороны?

Я знаю, что этот предмет довольно широко описан во многих "учебных пособиях" в сети, но по какой-то причине у меня возникают проблемы с поиском действительно простых, но наглядных вводных. Так что если кто-то может опубликовать пример или два, простые, я был бы очень благодарен. Или просто возьмите меня за руку и проведите через один рабочий пример.

платформа: ЭКО 11. что-то :) на Win XP SP2, Matlab 2008b

Ответы [ 3 ]

4 голосов
/ 01 июня 2010

Самый простой способ - заставить вашу программу на Фортране записывать в файл, а ваша программа Matlab считывает эти файлы для получения информации, которую вы хотите построить. Я делаю большую часть своего перебора чисел в Linux, поэтому я не совсем уверен, как Windows обрабатывает один процесс, записывающий файл, а другой читает его одновременно.

Хотя это немного клудж, так что вы можете подумать об использовании Matlab для вызова программы на Фортране (или ее части) и получения данных непосредственно для построения графиков. В этом случае вы захотите изучить Создание файлов Fortran MEX в документации Matlab. Это относительно просто сделать, и будет отвечать вашим потребностям, если вы будете рады использовать Matlab для управления процессом и Fortran для работы в качестве вычислительной службы. Я бы посмотрел примеры, распространяемые с Matlab, для простых файлов Fortran MEX.

Наконец, вы можете вызвать Matlab из вашей программы на Fortran, найти документацию для Вызов Matlab Engine . Мне немного сложнее понять, как это может соответствовать вашим потребностям, и я с этим ужасно не знаком.

Если вы отправите сообщение с более подробной информацией, я смогу дать более конкретные советы, но вам, вероятно, следует начать закатывать рукава и погружаться в MEX-файлы.

3 голосов
/ 02 июня 2010

Продолжение обсуждения DISLIN как решения, с ответом, который не вписывается в комментарий ...

@ M. С. Б. - привет. Я прошу прощения за запись в вашем ответе, но эти комментарии слишком короткие, и ответить на вопрос в форме ответа с ответом ... в любом случае ...

В DISLIN есть функция Quick Plot - подпрограмме QPLOT требуется только три аргумента для построения кривой: массив X, массив Y и число N. См. Главу 16 руководства. Плюс всего несколько дополнительных звонков для выбора устройства вывода и маркировки осей. Я этим не пользовался, поэтому не знаю, насколько хорош автоматическое масштабирование.

Да, я знаю Quickplot и связанные с ним подпрограммы, но он слишком фиксирован для моих нужд (ничего не может изменить), и да, его автоматическое масштабирование несколько странно. Кроме того, слишком большие поля внутри графа.

Или, если вы хотите использовать возможности GRAF для настройки графического блока, есть подпрограмма GAXPAR для автоматического создания рекомендуемых значений. -2 в качестве первого аргумента LABDIG автоматически определяет количество цифр в метках галочки.

Вы пробовали процедуры?

Извините, я не могу найти процедуру GAXPAR, на которую вы ссылаетесь, в индексе Дислина. Вы уверены, что он называется именно так?

Ответ М.С.Б. : Да, я уверен в написании GAXPAR. Это последняя процедура в главе 4 руководства пользователя DISLIN 9.5 PDF. Возможно, это новая рутина? Также существует другой путь к автоматическому масштабированию: 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, выполнить собственное автоматическое масштабирование будет проще, чем вызывать Fortran из MATLAB. Вы можете использовать встроенные функции Fortran minval и maxval, чтобы найти наименьшее и наибольшее значения в данных, а затем написать подпрограмму для округления в сторону «хороших» значений округления. Точно так же подпрограмма, чтобы выбрать интервал между отметками.

Это на самом деле не так легко осуществить (и идеи, которые докажут меня неправильно, будут с благодарностью оценены). Или я должен сказать, что это легко, если вы знаете приблизительный диапазон, в котором будут лежать ваши значения. Но если вы этого не сделаете, и вы не знаете, будут ли ваши значения лежать в диапазоне 13-34 или 1330-3440, тогда ...

... если я здесь совершенно не на том пути, пожалуйста, объясните, если вы что-то другое. Моему английскому немного не хватает, так что я могу только надеяться, что вышеизложенное понятно.

Внутри подпрограммы для определения начальных / конечных значений круглого графика вы можете масштабировать фактические минимальные / максимальные значения всегда между 1 и 10, затем иметь таблицу для выбора хороших круглых значений, а затем масштабировать обратно до правильного диапазона.

-

2 голосов
/ 02 июня 2010

Дамп Matlab, потому что его проприетарные, дорогие, раздутые / медленные и коды нелегко распараллелить.

Что вы должны сделать, это использовать что-то на линиях DISLIN, PLplot, GINO, gnuplotfortran и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...