Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Matlab] Из Matlab вызвать С++ 
:(
    Опции темы
lisushka
Дата 28.5.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дело в том, что в Matlab я создала в GUI интерфейс диалогового окна. После нажатия на кнопку "Результат", должен запускаться код алгоритма на С++. Я, честно, уже намучалась, не получается. Как это можно сделать?

Часть кода на Matlab:
Код

function [] = algoritm4(n1,m1,a1,b1,x_h1,x_l1,znach_eps1,kol1,pogr1)
%ALGORITM1 Базовый алгоритм.
%n1=msgbox(n,'Алгоритм 4 пошел!','warn') 
n2=str2double(n1)
nn=uint8(n2)
m2=str2double(m1)
mn=uint8(m2)
an=str2double(a1)
bn=str2double(b1)
x_hn=str2double(x_h1)
x_ln=str2double(x_l1)
znach_epsn=str2double(znach_eps1)
kol2=str2double(kol1)
koln=uint8(kol2)
pogrn=str2double(pogr1)

tripdata
save gardata nn mn an bn x_hn x_ln znach_epsn koln pogrn
!gareqn
load gardata





Функция main на C++:

Код

#include <iostream.h>
# include <stdlib.h>
# include <stdio.h>
# include <conio.h>
#include <fstream.h>
# include <iomanip>
#include <math.h>



int kFunc;
int kGrad;

int kNeRes=0;
int kol;

#include "Generator.cpp"
#include "F_Gr.cpp"
#include "MZO.cpp"
#include "MOV_Base.cpp"
#include "MOV_uro.cpp"
#include "MOV_bi.cpp"


void main(void)
{
    int n; 
    int m; 
    double *A,*b,*c,*x0,*x_dop,*x_opt;
    double ro2,pogr,eps;
    int j;
    int kRes=0;
    int maxf1,minf1,srednf1,maxg1,ming1,sredng1,
        maxf2,minf2,srednf2,maxg2,ming2,sredng2,
        maxf3,minf3,srednf3,maxg3,ming3,sredng3;
    n=10; m=20;

    ofstream out;
    out.open("test10_20_vivod.txt");
    if(!out)
    {
        cout<<"File is not possible open\n";
        return;
    }
   
    
    A=new double[n*n*(m+1)];
    b=new double[n*(m+1)];
    c=new double[m+1];
    x_dop=new double[n];
    x0=new double[n];
    x_opt=new double[n];

    pogr=0.005;
    out<<"pogr="<<pogr<<"\n";
    eps=1000.0;
    out<<"eps="<<eps<<"\n";
    for(kol=0;kol<20;kol++)
    {
        printf("kol=%d\n",kol);
        out<<"Íîìåð çàäà÷è="<<kol<<"\n";
        Gen_task(n,m,-0.01,0.01,-1000.0,1000.0,eps,A,b,c,x_dop);

        ro2=0;
        for (j=0; j<n; j++)
        {    x0[j]=0.01;
            ro2+=x_dop[j]*x_dop[j];
        }
        if(kol>15)
        {

            for (j=0; j<n; j++){
        printf("x_dop[%d]=%lf\n",j,x_dop[j]);
        out<<"x_dop="<<x_dop<<"\n";}
            for (j=0; j<=m; j++){
                printf("f[%d]=%lf\n",j,func(n,A,b,c,j,x_dop));
                    out<<"f="<<func(n,A,b,c,j,x_dop)<<"\n";}
        }
        for (j=0; j<=m; j++)
        {
            printf("f[%d]=%lf\n",j,func(n,A,b,c,j,x0));
            out<<"f["<<j<<"]\t"<<func(n,A,b,c,j,x0)<<"\n";
    
//    getch();
        }

        kFunc=0;
        kGrad=0;
        MOV(n,m,pogr,A,b,c,x0,sqrt(ro2),x_opt);
     if(kNeRes>0){kol++; break;}

    
        printf("MOV_base kFunc=%d kGrad=%d\n",kFunc,kGrad);
        out<<"kFunc="<<kFunc<<"\t"<<"kGrad="<<kGrad<<"\n";

        if (kol==0)
        {    maxf1=minf1=srednf1=kFunc;
            maxg1=ming1=sredng1=kGrad;
        }
        else
        {
            if (maxf1<kFunc) maxf1=kFunc;
            if (minf1>kFunc) minf1=kFunc;
            srednf1+=kFunc;
            if (maxg1<kGrad) maxg1=kGrad;
            if (ming1>kGrad) ming1=kGrad;
            sredng1+=kGrad;
        } 
//    for (j=0; j<n; j++)
//        printf("x_opt[%d]=%lf\n",j,x_opt[j]);
        for (j=0; j<=0; j++)
        {
            printf("f[%d]=%lf\n",j,func(n,A,b,c,j,x_opt));
            out<<"f["<<j<<"]\t"<<func(n,A,b,c,j,x_opt)<<"\n";

        }

        kFunc=0;//ñ÷åò÷èê êîëè÷åñòâà âû÷èñëåíèé ôóíêöèè
        kGrad=0;//ñ÷åò÷èê âû÷èñëåíèé ãðàäèåíòà
        MOV_uro(n,m,pogr,A,b,c,x0,sqrt(ro2)/100,x_opt);
        out<<"Ýâðèñòè÷åñêèé ìåòîä óñêîðåíèÿ ñ ro-êðèâûì\n";
        printf("MOV_uro kFunc=%d kGrad=%d\n",kFunc,kGrad);
        out<<"kFunc="<<kFunc<<"\t"<<"kGrad="<<kGrad<<"\n";

        if (kol==0)
        {    maxf2=minf2=srednf2=kFunc;
            maxg2=ming2=sredng2=kGrad;
        }
        else
        {

        if (maxf2<kFunc) maxf2=kFunc;
        if (minf2>kFunc) minf2=kFunc;
        srednf2+=kFunc;
        if (maxg2<kGrad) maxg2=kGrad;
        if (ming2>kGrad) ming2=kGrad;
        sredng2+=kGrad;
        }
//    for (j=0; j<n; j++)
//        printf("x_opt[%d]=%lf\n",j,x_opt[j]);
        for (j=0; j<=0; j++)
        {
            printf("f[%d]=%lf\n",j,func(n,A,b,c,j,x_opt));
            out<<"f["<<j<<"]\t"<<func(n,A,b,c,j,x_opt)<<"\n";
        }

        kFunc=0;
        kGrad=0;
        MOV_bi(n,m,pogr,A,b,c,x0,5,x_opt);
        printf("MOV_bi kFunc=%d kGrad=%d\n",kFunc,kGrad);
        out<<"kFunc="<<kFunc<<"\t"<<"kGrad="<<kGrad<<"\n";
        if (kol==0)
        {    maxf3=minf3=srednf3=kFunc;
            maxg3=ming3=sredng3=kGrad;
        }
        else
        {
        if (maxf3<kFunc) maxf3=kFunc;
        if (minf3>kFunc) minf3=kFunc;
        srednf3+=kFunc;
        if (maxg3<kGrad) maxg3=kGrad;
        if (ming3>kGrad) ming3=kGrad;
        sredng3+=kGrad;
        }
//    for (j=0; j<n; j++)
//        printf("x_opt[%d]=%lf\n",j,x_opt[j]);
        for (j=0; j<=0; j++)
        {
            printf("f[%d]=%lf\n",j,func(n,A,b,c,j,x_opt));
            out<<"f["<<j<<"]\t"<<func(n,A,b,c,j,x_opt)<<"\n";
        }

//    grad(n,A,b,c,0,x_opt,x0);
//    ro2=0;
//    for (j=0; j<n; j++)
//        ro2+=x0[j]*x0[j];
//    printf("gr=%lf kFunc=%d kGrad=%d\n",ro2,kFunc,kGrad);
    }
    kRes=kol-kNeRes;

    srednf1/=kRes; sredng1/=kRes;
    srednf2/=kRes; sredng2/=kRes;
    srednf3/=kRes; sredng3/=kRes;

  out<<"maxf1="<<maxf1<<"\t";
  out<<"minf1="<<minf1<<"\t";
  out<<"srednf1="<<srednf1<<"\n";
  out<<"maxg1="<<maxg1<<"\t";
  out<<"ming1="<<ming1<<"\t";
  out<<"sredng1="<<sredng1<<"\n";

  out<<"maxf2="<<maxf2<<"\t";
  out<<"minf2="<<minf2<<"\t";
  out<<"srednf2="<<srednf2<<"\n";
  out<<"maxg2="<<maxg2<<"\t";
  out<<"ming2="<<ming2<<"\t";
  out<<"sredng2="<<sredng2<<"\n";

  out<<"maxf3="<<maxf3<<"\t";
  out<<"minf3="<<minf3<<"\t";
  out<<"srednf3="<<srednf3<<"\n";
  out<<"maxg3="<<maxg3<<"\t";
  out<<"ming3="<<ming3<<"\t";
  out<<"sredng3="<<sredng3<<"\n";

 
  out.close();
}


PM MAIL   Вверх
lisushka
Дата 28.5.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Забыла еще добавить, что Функция algoritm4 вызывается в функции
function btnResult_Callback(hObject, eventdata, handles)
PM MAIL   Вверх
popovda
Дата 28.5.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



www.matlab.exponenta.ru Советую там на форуме спросить - быстрее ответят. Да, кстати, а где 
в коде вызов C-функции? Что-то не вижу...

Это сообщение отредактировал(а) popovda - 28.5.2007, 14:45


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
lisushka
Дата 28.5.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так вот я и не понимаю, как сделать вызов функции main из Matlab

PM MAIL   Вверх
popovda
Дата 29.5.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А, ну так точнее надо вопросы формулировать. Вобщем, тут такая штука:
1. Из твоей с-шной проги надо сделать dll-библиотеку c mex-функцией.
2. Ее поместить в одну из matlab-папок, например в work
3. И вызвать как обычную функцию.
Если не горит, то я код с примером завтра принесу - тут книжки нету. А если горит, то или в help'е смотри как mex-функция делается, либо на www.matlab.ru в форуме.

Добавлено через 8 минут и 7 секунд
Вот из help'а
Код

#include <math.h>
void timestwo(double y[], double x[])
{
  y[0] = 2.0*x[0];
  return;

}

Код


/*
 * =============================================================
 * timestwo.c - example found in API guide
 *
 * Computational function that takes a scalar and doubles it.
 *
 * This is a MEX-file for MATLAB.
 * Copyright (c) 1984-2000 The MathWorks, Inc.
 * =============================================================
 */
 
/* $Revision: 1.1.6.7.2.2 $ */

#include "mex.h"

void timestwo(double y[], double x[])
{
  y[0] = 2.0*x[0];
}

// Вот она-то и является главной dll-функцией. Подробнее в help'е. 
// И еще. dll должна иметь имя функции, которая вызывается из матлаба.
void mexFunction(int nlhs, mxArray *plhs[], int nrhs,
                 const mxArray *prhs[])
{
  double *x, *y;
  int mrows, ncols;
  
  /* Check for proper number of arguments. */
  if (nrhs != 1) {
    mexErrMsgTxt("One input required.");
  } else if (nlhs > 1) {
    mexErrMsgTxt("Too many output arguments");
  }
  
  /* The input must be a noncomplex scalar double.*/
  mrows = mxGetM(prhs[0]);
  ncols = mxGetN(prhs[0]);
  if (!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) ||
      !(mrows == 1 && ncols == 1)) {
    mexErrMsgTxt("Input must be a noncomplex scalar double.");
  }

  /* Create matrix for the return argument. */
  plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL);
  
  /* Assign pointers to each input and output. */
  x = mxGetPr(prhs[0]);
  y = mxGetPr(plhs[0]);
  
  /* Call the timestwo subroutine. */
  timestwo(y,x);
}



--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
lisushka
Дата 29.5.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я попробую по написанному вами сама сделать, но в любом случае интересно узнать ваш вариант тоже. День в запасе есть,буду ждать...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Добро пожаловать в раздел "Другие языки" форума Vingrad!

Void
Void

Раздел посвящён различным языкам программирования, для которых (в силу невысокой популярности) нет отдельного раздела (GPSS, Lua, MATLAB, Ada, Forth, Smalltalk, Tcl, REXX, AWK и др.)

  • Обязательно следуйте правилам Форума.
  • Пожалуйста, прочитайте и следуйте рекомендациям по работе в разделе и навигации по Форуму.
  • Для вставки текстов исходных кодов используйте подсветку синтаксиса из выплывающего списка Код в форме ответа. Если Ваш язык в списке не представлен, то используйте тег: [code=ваш_язык]код[/code], например, [code=ada]код[/code]. Если в будущем подсветка синтаксиса для указанного языка будет реализована, исходный код преобразится.
  • Помните, один вопрос - одна тема.

Приятного времяпрепровождения! С уважением, Void, kemiisto .

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Другие языки | Следующая тема »


 




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


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

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