Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Matlab] Matlab+C++ 
:(
    Опции темы
Эйнштейн
Дата 15.10.2003, 17:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Люди! Помогите пожайлуста соединить С++ и Матлаб!! Или может есть какие нибудь ссылки!!! Заранне пасиба!

  Вверх
Гость_Oleg
Дата 15.10.2003, 18:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В инсталлированном Матлабе есть *.h и *.dll файлы для связи. Наверное и в описании что то есть.
  Вверх
эй
Дата 5.11.2003, 17:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
Люди! Помогите пожайлуста соединить С++ и Матлаб!! Или может есть какие нибудь ссылки!!!
Нужно достать из С функции Матлаба.
Заранне пасиба!

Люди! Помогите пожайлуста соединить С++ и Матлаб!! Или может есть какие нибудь ссылки!!!
Нужно достать из С функции Матлаба.
Заранне пасиба!
  Вверх
podval
  Дата 7.11.2003, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: нет
Всего: 62



Можно поконкретнее? Я "доставал" функции Matlab'a из C и "соединял" С и Matlab. Это можно сделать несколькими способами в зависимости от того, какая конкретно задача решается, какие функции надо достать. И на каждый способ есть свои ограничения.
Итак, что конкретно нужно сделать?
PM WWW ICQ   Вверх
эй
Дата 17.11.2003, 13:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Поконкретнее:

необходимы функции для обработки сигналов и изображений.
  Вверх
Waters
Дата 18.11.2003, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 16.11.2003

Репутация: нет
Всего: нет



Цитата
Помогите пожайлуста соединить С++ и Матлаб


Вот пример вызова функции "eig" Матлаба (вычисление собст. значений и векторов).
Может помочь понять передачу параметров.
Код

#include "matlab/matlab61/libmatlbm.h"
#include "matlab/matlab61/matrix.h"
// вход: матрица A[m*m];
// выход: evals[m] - с.значения, Evecs[m*m] - c.вектора
int matlab_eig(int m, double *A, double *evals, double *Evecs)
{
 mxArray *mA=NULL;
 mxArray *mR=NULL;
 mxArray *out1[1]={NULL};
 double *p_re, *p_im; // ук-ли на действительную и мнимую часть
 int i, j, idx;
 mA=mclCreateDoubleMatrix(m, m, mxREAL);
 if(mA == NULL)
   return -1;
 p_re = mxGetPr(mA);
 if(p_re == NULL)
   return -1;
 for(i=0; i<m; ++i)
 {
   for(j=0; j<m; ++j)
   {
     idx=(i + m*j);
     p_re[idx]=A[idx];
   }
 }
 // вызов ф-ии "eig" Матлаба
 mR = mlfEig(out1, mA, NULL, NULL);
 p_re = mxGetPr(mR);
 if(p_re == NULL)
   return -1;
 for(i=0; i<m; ++i)
 {
   for(j=0; j<m; ++j)
   {
     idx=(i + m*j);
     Evecs[idx]=p_re[idx];
   }
 }
 p_re = mxGetPr(out1[0]);
 if(p_re == NULL)
   return -1;
 for(i=0; i<m; ++i)
 {
   j=i; // диаг. эл-ты - с.з.
   idx=(i + m*j);
   evals[i]=p_re[idx];
 }
 mxDestroyArray(mA);
 mxDestroyArray(mR);
 mxDestroyArray(out1[0]);
 return 0;
}


wbr
PM MAIL   Вверх
podval
Дата 19.11.2003, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: нет
Всего: 62



Пример реальный, работает. Только я бы рекомендовал еще обратить внимание на класс mwArray. C ним работать удобнее именно в С++. Тип mxArray - это лучше для чистого С. Чуть попозже дам пример.
Сразу оговорюсь, что все эти извращения с mxArray и mwArray годятся только для тех функций, для которых имеются готовые сишные прототипы в, соответственно, MATLAB C Math Library и MATLAB C++ Math Library. Их не так много, как хотелось бы, но их там есть smile.gif.
Если нет, то можно выкрутиться компиляцией своих m-файлов в С/С++, что, к сожалению, очень редко проходит. Так, например, бесполезно компилировать m-файл, содержащий вызов матлабовской функции fmincon. Матлабовский компилятор для этого весьма слабоват и не понимает ООП, когда речь заходит о переводе в С++. В таких "тяжелых" случаях я выкручивался использованием Matlab в режиме ActiveX сервера. Как это делать, написано в доке. Там просто объявляешь рабочую область под Matlab, вызываешь его ядро и гоняешь туда-сюда переменные: в ядро загоняешь исходные даные, а обратно вынимаешь результат. Пример тоже позже выложу.
PM WWW ICQ   Вверх
podval
Дата 19.11.2003, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: нет
Всего: 62



Итак, примеры. Сразу оговорюсь, что я делал все под Borland C++ Builder 5 и Matlab 6. Чтобы BCB понимал, что от него требуется, надо добавить в опции проекта Include path и Libraries path. На моем компе это

e:\matlabr12\extern\include\;e:\matlabr12\extern\include\cpp\
e:\matlabr12\extern\lib\win32\;e:\matlabr12\extern\lib\win32\borland\bc54\

а в Conditionals/Defines вместо написанного там по умолчанию _DEBUG записать:

BORLAND;IBMPC;MSWIND


Кроме того, к проекту нужно явно подключить (например, прямо в менеджере проекта) нужные *.lib из матлабовской поставки (т.е. из той самой директории <MATLAB>\extern). Какие именно библиотеки - это определяется тем, какие функции нужны. Подробности - в доке (файл cppmath_ug2b.pdf). У меня понадобились:

libmatpb55.lib - этот обязательно, так как компилятор версии 5.5
libmat.lib
libmatlb.lib
libmmfile.lib
libmx.lib

Ну и конечно не забыть #include "matlab.hpp".

Ниже небольшой участок кода. В комментариях пишу, что это значило бы на Matlab-скрипте.

Цитата

    ...

    // загрузка вектора А из файла
    mwArray A;
    ifstream a_file("alpha.prn", ios::in);
    a_file >> A;                                       // load alpha.prn; A = alpha;
    a_file.close();

    mwArray Q = zeros(ComponentCount, 1); // Q = zeros[ComponentCount,1];

    mwArray d = K(12, colon()); // d = K(12, :);


    mwArray dd = 0.001*d;

    mwArray XX = times(X, transpose(dd)); // XX = X.*dd'; - поэлементное
    mwArray Y;
    Y = MyFunction(XX, K, Q, (double)tau, A); // это С++ прототип
                                                                                  // функции пользователя

    // Переводим Y из mwArray в формат С++
    mwArray Ny = length(Y); //определяем кол-во элементов
    int N1=*(mxGetPr(Ny.GetData())); // то же кол-во в формате С++
    double* DataY = new double[N1]; // выделяем память
    for(int i=0; i < N1; i++)
    {
       DataY[i]=*(mxGetPr(Y.GetData())+i);  // переводим Y -> DataY
    }
...

//---------------------------------------------------------------------------------------
mwArray MyFunction(mwArray &x, mwArray &k0, mwArray &Q0,
                                               double tau, mwArray &A)
{
  mwArray k1 = k0(colon(1,11), colon()); // k1 = k0(1:11,:);

  mwArray x0 = times(x, tau);          // x0 = x*tau;   tau - скаляр
  x0 = plus(x0, Q0);                   // x0 = x0 + Q0;
  mwArray x1 = mrdivide(x, sum(x));    // x1 = x/sum(x);

  mwArray y0 = mtimes(k1, x1);   // y0 = k1*x1; - матричное умножение
  mwArray tx1 = times(x1, 1-x1); // tx1 = x1.*(1-x1); - поэлементное

  mwArray atx1 = mtimes(A, tx1);

  mwArray yy = times(y0, atx1);

  mwArray y = plus(y0, yy);

  return y;
}
//-----------------------------------------------------------------------------


PM WWW ICQ   Вверх
podval
Дата 19.11.2003, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: нет
Всего: 62



Теперь пример с использованием Matlab Engine. Он выручает, когда нет готового С/С++ прототипа для функции, которую надо вызвать из С/С++.
Нижеприведенные фрагменты кода показывают саму идею. Более простой пример есть в доке (файл apiext.pdf).
В показанном примере мы вызовем некую определенную пользователем функцию, хранящуюся в m-файле (он должен находиться в директории <MATLAB>/work !!!).

Цитата


// !!! к проекту надо подключить libeng.lib !!!

#include "engine.h"

...

  Engine *ep; //  MATLAB engine

  //Start the MATLAB engine
  if (!(ep = engOpen(NULL)))
  {
      MessageDlg("Не могу запустить MATLAB Engine",
              mtError, TMsgDlgButtons() << mbOK, 0);
      exit(-1);
  }
  else
  {
      HWND hWnd = FindWindow(0, "MATLAB Command Window");
      ShowWindow(hWnd, SW_HIDE); // прячем матлабовское окно
  }

...

  double *a, *b;
...
  // предположим, a и b у нас где-то инициализированы
...


  // загоняем переменные в рабочую область Matlab
  mxArray *A = NULL;
  A = mxCreateDoubleMatrix(1, m, mxREAL); // вектор
  mxSetName(A, "A"); // означает, что в рабочей области Matlab A будет зваться тоже А
  memcpy((char *) mxGetPr(A), (char *) a, m*sizeof(double));
  engPutArray(ep, A);

  mxArray *В = NULL;
  В = mxCreateDoubleMatrix(m, n, mxREAL); // матрица mxn
  mxSetName(B, "B");
  memcpy((char *) mxGetPr(B), (char *) b, m*n*sizeof(double));
  engPutArray(ep, B);

  engEvalString(ep, "Y = myfunc(A,B)"); // здесь в строке прямо пишем матлабовскую команду

  // достаем результат Y
  mxArray Y = engGetArray(ep, "Y");
 
  // переводим Y в формат С++
  int ny = mxGetM(Y);
  double* DataY = new double[ny];
  for(int i=0; i < ny; i++)
  {
      DataY[i]=*(mxGetPr(Y)+i);
  }
 
  mxDestroyArray(A); // освобождаем память
  mxDestroyArray(B);
  mxDestroyArray(Y);
...

  engClose(ep); // закрываем рабочую область


NB! Для Matlab 6.5 группа операторов

mxSetName(B, "B");
memcpy((char *) mxGetPr(B), (char *) b, m*n*sizeof(double));
engPutArray(ep, B);

заменяется на один вот такого формата:

PutVariable(const char *name, const mxArray *mp);
PM WWW ICQ   Вверх
podval
Дата 19.11.2003, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: нет
Всего: 62



З.Ы. надеюсь, это действительно кому-то поможет, в свое время потратил много сил, пока дрюкался со "скрещиванием" С++ и Matlab'a smile.gif
PM WWW ICQ   Вверх
Unregistered
Дата 20.11.2003, 04:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2 podval
Скажите, вам не приходилось вызывать из своих программ матлабовский компенент, строящий 3d-поверхность?
(Хотелось бы его "вставить" в свой проект...)


wbr.

  Вверх
podval
Дата 20.11.2003, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: нет
Всего: 62



Нет, не приходилось, да и если бы пришлось, я бы лучше построил поверхность теми средствами, которые предоставляет среда разработки на С++. В борландовском C++ Builder, например, очень приличный TChart. В Matlab'e, конечно, графики выглядят красиво. Но вызвать этот график можно двумя путями:
1) воспользоваться Matlab Engine

engEvalString(ep, "surf(A);");

Однако большой недостаток использования Matlab Engine в том, что он долго запускается. Строку

ep = engOpen(NULL)))

мне приходилось вешать на обработчик события FormShow() главной формы, чтобы было впечатление, что это как бы вся програма долго загружается в память. Все-таки матлабовское ядро - тяжеловатая вещь, долго грузится, и написано оно на Java (отсюда кросс-платформенность), и работает в режиме интерпретатора.

2) скомпилировать в *.exe матлабовский файл с вызовом функции построения графика. Делается подключением Matlab C++ Graphics Library. В руководстве по матлабовскому компилятору пишут, как это сделать.
Тоже не лучшее решение, т.к. программу придется всю писать на Matlab, а это значит, что еще не факт, что она скомпилируется. кроме того. полученный *.exe работает весьма хитро: сначала видно, как запускается какое-то окно со вспомогательным консольным приложением, а поверх него твоя прога с какой-то там графикой. Выглядит смешно.

Вобщем, графики лучше делать тем, что есть.
PM WWW ICQ   Вверх
Guest
Дата 15.11.2005, 11:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Интересно, а как TCart юзать, если он при увеличении числа точек, или при выборе surface орет что не поддерживает данную фичу и просит позвонить куда-то там? ( у меня Visual Component First Impression)
  Вверх
ДобренькийПапаша
Дата 13.5.2007, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



А где можно скачать Matlab С++ Math и Matlab Compiler? Подскажите пожалуйста...очень хочу, может есть где бесплатно качнуть можно?


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
popovda
Дата 14.5.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 9.6.2006
Где: Москва

Репутация: нет
Всего: 6



Matlab compiler - вещь, насколько я помню, бесплатная, как и RunTime. Это для того, чтобы поставлять библиотеки, если прога в matlab писалась или его использует. Доступны с сайта mathworks.com. Ребята - по матлабу лучше, чем спецы Softline никто не поможет. Их сайт по матлабу: www.matlab.exponenta.ru


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Математические пакеты | Следующая тема »


 




[ Время генерации скрипта: 0.0830 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.