Kỹ thuật sử dụng Matlab/LabView trong nghiên cứu và tính toán

Discussion in 'Computer science & Electrical Engineering' started by thelast, Jun 4, 2008.

  1. loveoflife

    loveoflife Thèm thuồng

    Vấn đề nằm ở chỗ CVX sử dụng một số trick đặc biệt để giúp cho việc khai báo một optimization problem được tự nhiên (giống như khi viết problem đó trên giấy, thay vì phải tự biến đổi nó thành các ma trận rồi gọi hàm). Tuy nhiên các trick này không làm việc khi bạn gọi thông qua Matlab engine như bạn vừa làm. Mặc dù có thể có cách làm cho chúng hoạt động, nhưng it's not worth doing that. Riêng đối với optimization, theo tôi bạn không nên dùng Matlab để giải như vậy mà nên dùng trực tiếp các thư viện C/C++ để giải. Thực tế thì (đa phần) các optimization toolbox trên Matlab cuối cùng đều gọi các thư viện C/C++ để giải; nói cách khác, chúng chỉ làm nhiệm vụ interface là chính.

    Có nhiều thư viện C/C++ khác nhau để giải các bài toán optimization khác nhau, bạn có thể tìm trên internet. Ví dụ như GLPK. Trong trường hợp bạn nhất quyết muốn dùng Matlab thì có thể dùng các thư viện như Sedumi, Yalmip. Trang này http://control.ee.ethz.ch/~joloef/wiki/pmwiki.php?n=Solvers.Solvers có liệt kê khá nhiều các solver khác nhau, theo từng loại, cả cho Matlab và C/C++.
     
    ilysm147 likes this.
  2. Timmy

    Timmy Viên mãn

    CVX cũng rất tốt bạn ạ, mặc dầu Steven có viết luôn cả solver, nhưng không ổn định lắm, nên thật ra cvx cũng chỉ là cái interface rồi sau đó gọi Sedumi hoặc SDPT3 để giải thôi, cvx thì thích SDPT3 hơn nhưng Yalmip thì thích sedumi. Bạn cứ làm tiếp với Sedumi đi, kể cả chỉ dùng trong Matlab, cũng sẽ có đầy ra những lỗi ngớ ngẫn đến khó tin.
     
    ilysm147 likes this.
  3. ilysm147

    ilysm147 Thèm thuồng

    Mình vừa viết thư hỏi tác giả CVX (S.Boyd & M.Grant), không biết họ có trả lời không nữa. Mình cũng search thử các solver khac để giải bài toan convex programming thì thấy có cái COPL_LC, nhưng mà cái thằng này lại viết trong Fortran, thế mới đau. Có bạn nào biết cách convert từ Fortran sang C không?
     
  4. ilysm147

    ilysm147 Thèm thuồng

    Mình vừa nhận được mail của Boyd và Grant, post lên để anh em tham khảo.

    --- On Thu, 10/9/08, Stephen Boyd <boyd@stanford.edu> wrote:

    > From: Stephen Boyd <boyd@stanford.edu>
    > Subject: Re: Errors of CVX Solver
    > To: "quangthuan nguyen" <quangthuan.nguyen@umail.univ-metz.fr>
    > Cc: "Stephen Boyd" <boyd@stanford.edu>, "Michael Grant" <mcgrant@stanford.edu>, "Jacob Mattingley" <jacobm@stanford.edu>
    > Date: Thursday, October 9, 2008, 10:32 PM
    > i thought i'd jump in to the conversation.
    >
    > if you intend to embed a convex optimization solver
    > in some C/C+
    > + code, you might be better off using CVXMOD/CVXOPT, which
    > is a convex
    > optimization modeling system built in python, which is
    > *easily*
    > callable from C. you'll find CVXOPT and CVXMOD on the
    > web. (and do
    > let us know if this works for you; it should.)
    >
    > On Oct 9, 2008, at 7:45 AM, Michael C. Grant wrote:
    >
    > > Ah. Well, that settles it, then. Unfortunately CVX
    > cannot be used
    > > from within a C/C++ program.
    > >
    > > On Oct 9, 2008, at 9:41 AM, quangthuan nguyen wrote:
    > >
    > >>
    > >> I tried this way too but i got the message below:
    > >>
    > >> Warning: Debug commands not available when using
    > MATLAB as Engine.
    > >>> In:
    > c:\matlab6p5\cvx\lib\@cvxprob\cvxprob.m
    > at line 14
    > >> In:
    > c:\matlab6p5\cvx\commands\cvx_begin.m at
    > line 41
    > >> In c:\matlab6p5\work\baitoan.m at
    > line 4
    > >> ??? One or more output arguments not assigned
    > during call to
    > >> 'dbstack'.
    > >>
    > >> Error in
    > ==>c:\matlab6p5\cvx\lib\@cvxprob\cvxprob.m
    > on line 14 ==>
    > >> st=dbstack;
    > >> Error in
    > ==>c:\matlab6p5\cvx\commands\cvx_begin.m
    > on line 41 ==>
    > >> assignin<'caller',
    > 'cvx_problem', cvxpro
    > >>
    > >>
    > >> In this message,the baitoan.m is a file that
    > contains the CVX model
    > >> and its 4th line is "cvx_begin".
    > >>
    > >> ---------------------------------
    > >>
    > >> I've never tried to use CVX in this way. And
    > I'm honestly not too
    > >> surprised that it doesn't work. I think that
    > what you would have to
    > >> do
    > >> is create a single '.m' file that contains
    > your CVX model, with A and
    > >> b as input and x as ouptut. Then you can call it
    > using a single call
    > >> to engEvalString.
    > >>
    > >> On Oct 9, 2008, at 3:50 AM, quangthuan nguyen
    > wrote:
    > >>
    > >>>
    > >>> Dear Prof. S. Boyd and Prof. M.Grant,
    > >>>
    > >>> I use the CVX to solve my convex programming.
    > When I launch it
    > >>> directly from Matlab, everything is ok. But
    > when I call Matlab from
    > >>> C, there are some errors with CVX.
    > >>> My code is following:
    > >>>
    > >>> int OptTest()
    > >>> {
    > >>> Engine *ep;
    > >>> ep = engOpen("matlab12 -nojvm
    > -nosplash");
    > >>>
    > >>> const int BUFSIZE=1024;
    > >>> char buffer[BUFSIZE];
    > >>> engOutputBuffer(ep, buffer, BUFSIZE);
    > >>>
    > >>> mxArray *A=NULL, *b=NULL,*x=NULL;
    > >>>
    > >>> A = mxCreateDoubleMatrix(12,6,mxREAL);
    > >>> b = mxCreateDoubleMatrix(6,1,mxREAL);
    > >>> memcpy((void *) mxGetPr(A), (void *) A01,
    > 72*sizeof(double));
    > >>> memcpy((void *) mxGetPr(b), (void *) b01,
    > 6*sizeof(double));
    > >>>
    > >>> engPutVariable(ep, "A",A);
    > >>> engEvalString(ep,"A=A'");
    > >>> cout << buffer;
    > >>>
    > >>> engPutVariable(ep, "b",b);
    > >>> engEvalString(ep,"b");
    > >>> cout << buffer;getch();
    > >>>
    > >>> engEvalString(ep,"n=12");
    > >>> cout << buffer;getch();
    > >>>
    > >>> //this code using CVX has some errors?
    > >>> engEvalString(ep, "cvx_begin");
    > >>> engEvalString(ep, "variable x(n)");
    > >>> cout << buffer;getch();//Attention 1
    > >>> engEvalString(ep,
    > "minimize(exp(x(10))+exp(x(11))+exp(x(12)))");
    > >>> engEvalString(ep, "subject to");
    > >>> engEvalString(ep, "A*x==b");
    > >>> engEvalString(ep, "x>=0");
    > >>> engEvalString(ep, "cvx_end");
    > >>> cout << buffer;getch();//Attention 2
    > >>>
    > >>> x = engGetVariable(ep,"x");
    > >>>
    > >>> engClose(ep);
    > >>> mxDestroyArray(x);
    > >>> mxDestroyArray(b);
    > >>> mxDestroyArray(A);
    > >>> return(0);
    > >>> }
    > >>>
    > >>> In the above code, I use command
    > “cout<<buffer” to view the message
    > >>> of Matlab errors. You see two lines that i
    > note comment "attention".
    > >>> When it runs to that first line, i see
    > "??? Error using ==>variable.
    > >>> A cvx problem does not exist in this
    > scope", on my screen and to the
    > >>> second one, the message is: "??? Error
    > using ==>cvx_end. No cvx
    > >>> problem exists in this scope".
    > >>>
    > >>> My question is that CVX is possible when I
    > call Matlab from C/C++?
    > >>> You know that I need the solution obtained by
    > CVX to continue
    > >>> solving my problem in C/C++.
    > >>>
    > >>> My OS is Windows XP, I use Matlab 6.5 and
    > Microsoft Visual C 6.0, I
    > >>> do not know which the version of CVX is(I
    > downloaded it from your
    > >>> webpage one week ago, so it is version 1.2? ).
    > >>>
    > >>> I thank you much and I am looking forward to
    > getting your answer/
    > >>> suggestion.
    > >>>
    > >>>
    > >>>
    > >>
    > >
    >
    > Stephen Boyd
    > Stephen P. Boyd
     
  5. loveoflife

    loveoflife Thèm thuồng

    Đúng như mình nói là CVX không work nếu gọi từ trong C/C++. Để chuyển từ Fortran sang C thì bạn có thể dùng f2c (gúc phát là ra ngay). Tuy nhiên mình vẫn (chân thành) khuyên bạn là dùng các thư viện C/C++ mà mình đã đề cập trong post trước. Bạn nên chọn những thư viện nào popular và có update gần đây, và tất nhiên phải chọn cái nào phù hợp cho bài toán của bạn nữa.

    Cái CVXMOD/CVXOPT dùng cho Python nhưng bạn muốn dùng C/C++ nên có lẽ cũng không thật thích hợp. Chưa kể nó cũng tương đối mới và chưa thật hoàn thiện.

    À, nếu bạn ở Hà Nội dịp tháng 12 này thì Prof. Boyd sẽ có buổi nói chuyện về convex optimization tại ĐHBK Hà Nội vào ngày 20 thì phải.
     
    ilysm147 likes this.
  6. haichit

    haichit Viên mãn

    He he, tiện thể có bác nhắc đến python, cho haichit hỏi nhỏ phát: Khi nào dùng python/C++(C). Python thi dễ viết và quản lý hơn nhưng C lại nhanh hơn. Không là dân CS nên chỉ biết hỏi thế thôi.:|
    Bác nào giải thích hộ tại sao người ta lại dùng FORTRAN trong numerical caclculation mà không dùng C nhỉ? Hay là các cụ già toàn dùng FORTRAN nên có nhiều thư viện hỗ trợ hơn?8-}
     
  7. ptt3i

    ptt3i I'm dreaming a dream

    Không biết bạn thelast ở đâu nhỉ?
    Nếu ở HN thì mua đĩa có phải là tốt không nhỉ?
    Mình cũng chỉ dùng đến Matlab 7.0.4 là thấy ổn lắm rồi.
     
    Last edited: Feb 23, 2009
    thangpthd likes this.
  8. haichit

    haichit Viên mãn

    tớ nói thật chứ ở VN thì ra mua đĩa cho nó nhanh, download lâu bỏ bu. Hoặc chịu khó config cái torrent, cho máy chạy thả phanh trong một đêm thì thoải mái con gà mái. Nếu ở nước ngoài thì ... phải down thật :D
     
  9. vodanhtieutot

    vodanhtieutot ham zui

    Không muốn mất tiền thì phải tập dùng torrent hoặc emule thôi, bạn lát nhỉ. Không biết bát lamlaitudau tìm link trên mạng, hay chịu khó ngồi up lên thì mình cũng bái phục ;;).
     
  10. ptt3i

    ptt3i I'm dreaming a dream

    Cũng không chắc đã đỡ mất tiền hơn đâu ạ!
    Vì thời gian là vàng bạc mà bổ thời gian down bộ matlab trên với tốc độ của mạng vn thì #:-Stoát mồ hôi hột ra ngay đấy ạ!
    Chắc bạn thelast phải trắng đêm từ 0h trở đi đến sáng hôm sau mới ổn!
    Cũng bái phục bác up cùng bác down lắm=D>
     
    thangpthd likes this.
  11. Dark2Bright

    Dark2Bright Thèm thuồng

    Math lab 7.7. Direct link provided by google:
    Code:
    1 http://www.mediafire.com/?marbefjvw1c
    2 http://www.mediafire.com/?idnwp0gkflm
    3 http://www.mediafire.com/?vg06yzor55m
    4 http://www.mediafire.com/?dbywh4be2bm
    5 http://www.mediafire.com/?tlev0yqyvrm
    6 http://www.mediafire.com/?sjbycotkezw
    7 http://www.mediafire.com/?wfmgnicazdm
    8 http://www.mediafire.com/?vtzx3wbbjto
    9 http://www.mediafire.com/?mczpfzypiyd
    10 http://www.mediafire.com/?2x4p3jczztv
    Pass unrar(if any):
    Code:
    WWW.SENDOWN.COM
     
    Last edited: Feb 23, 2009
  12. goahead

    goahead Thèm thuồng

    Bản này có đầy đủ ko thế? vì nếu up chùa lên media thì nó chỉ cho 100M mỗi file thì fai?
     
    Last edited: Feb 24, 2009
  13. pateheo

    pateheo Thèm thuồng

    Torrent với các PM phổ biến thế này thì seeders và leechers rất nhiều. Do đó down không thua gì link trực tiếp.
     
  14. Registerfly

    Registerfly Thèm thuồng

    Convert từ Fortran -> Matlab (Câu lệnh WHERE)

    Em đang có một hàm Fortran sử dụng WHERE như sau:
    Ở đây cả x và z đều là vector

    Em nghĩ là trong matlab sẽ phải có một cái gì tương tự thế, nếu không loop mỗi lần x thì expensive quá, bác nào biết thì chỉ em với.
     
  15. Macromedia

    Macromedia Thèm thuồng

    Thử xem có được không?
     
    Registerfly and aries like this.
  16. aries

    aries Thèm thuồng

    Bạn có thể viết thế này cũng được
    z(x>=0) = 4*sqrt(x(x>=0));
     
    Registerfly likes this.
  17. Registerfly

    Registerfly Thèm thuồng

    Cảm ơn các bác, em vừa test thử cả 2 cách thì thấy cách của bác aries nhanh hơn nên em sẽ dùng cách đó :D.
     
  18. ucme

    ucme Thèm thuồng

    Hôm nay vào đây đọc được topic này. Thấy hay quá.
    Có bác nào làm ơn chỉ em cách để setup sao cho có thể gọi được Matlab từ C/C++ không? (ví dụ setup environment variables,....)

    Hiện em chạy C trên Linux thì có thể gọi được Matlab không?

    Một câu hỏi nữa là: em chạy C từ server Linux của khoa, thì có phải setup gì đặc biệt không?
    Mong tin các bác,
     
  19. vuhung

    vuhung PhDって何?

    Lab mình dùng Xming+Putty

     
  20. HaiAu

    HaiAu Thèm thuồng

    Có phần mềm rồi thì cần có sách... Gửi tặng các bác một kho sách (trên 50 cuốn) về MATLAB/Simulink nè (tôi đã thử vài ba links thấy chúng đều tốt cả - có thể có vài links đã xịt nhưng mỗi cuốn có vài ba links nên sẽ có link còn, các bác download nhanh):

    Practical Matlab Basics for Engineers free download - free download online.

    Enjoy programming with MATLAB and Simulink!

    Phần mềm MATLAB/Simulink và các toolboxes kèm theo giá cực đắt. Nếu phải mua dùng chắc nhiều bác không chịu nổi! Ở các đại học thường mua Classroom Licence với đầy đủ các toolboxes thì rẻ hơn là licence dùng cho nghiên cứu và commercial use.

    Các bác có thể dùng phiên bản clone MATLAB/Simulink là Scilab và Scicos miễn phí sau:

    Scilab:
    Scilab Home Page

    Scicos:
    Scicos Homepage

    Kèm thêm cả trang web hướng dẫn dùng Scilab và Scicos của tác giả Finn Haugen (Norway):
    http://home.hit.no/~finnh/scilab_scicos/index.htm

    Ngoài ra nếu các bác dùng LabVIEW thì có thể xài MathScripts của LabVIEW hoàn toàn tương thích với MATLAB. LabVIEW & các Modules kèm theo tất nhiên không phải phần mềm mã nguồn mở, cũng đắt tương tự MATLAB/Simulink!

    HA
     
    Last edited: Oct 6, 2009
    baoche, hung and dinhcongbang like this.

Share This Page