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. thelast

    thelast Thèm thuồng

    Hi mọi người,

    mình là thành viên mới, mới hôm qua thôi;;). Tình cờ biết được trang web này, thấy rất bổ ích. Rất mong làm quen được với các cao thủ trên này.

    Hiện mình cần tìm phần mềm toán Matlab bản mới nhất. Bạn nào có làm ơn share cho mình với. Cám ơn nhiều nhiều.
     
  2. candy

    candy Thèm thuồng

    Bản mới nhất vài G, làm sao mà share được bạn, bạn chịu khó down bằng torrent!
     
  3. lamlaitudau

    lamlaitudau Thèm thuồng

    Nếu không muốn torrent thì link đây (đừng hỏi tớ down thế nào nhé, tớ sợ bạn nào hỏi câu này lắm :-SS):
    Links are interchangeable
    Netload:
    Depositfiles:
     
    woanwoan, envirchem and Hong Linh like this.
  4. thelast

    thelast Thèm thuồng

    Cám ơn nhiều nhe :) , tui không hỏi vớ vẩn thế đâu. Nhưng kể có của megaupload thì download được nhanh hơn.
    Nhưng thế này là tốt lắm rồi.
     
  5. jah

    jah Thèm thuồng

    Kỹ thuật lập trình thì để vào đâu? Lập trình C-Matlab

    Lập trình C-Matlab

    Jah mới thử nghiệp một kỹ thuật kết hợp 2 thằng này lại với nhau, cũng thật là thú vi! Tính năng thú vị:
    Lập trình C, build bằng Makefile, trong cái system đó, có vài chỗ gọi một file matlab (*.m) chạy. Như vậy, việc modify lại cái thuật toán viết trong file *.m thật dễ dàng và không phải tốn thời gian mô phỏng lại toàn bộ system bằng matlab. :)
    Jah thấy cách này rất hữu dụng, post lên đây để trao đổi thêm.
    Có bác nào đụng nhiều về vấn đề này thì cho Jah hỏi thăm thêm về kinh nghiệm nhé! :)
     
  6. theLight

    theLight Thèm thuồng

    Theo em thấy thì sau khi sửa code trong .m file thì phải dịch lại .exe (do make file dịch từ .c ra) chứ nhỉ? Bác gọi trực tiếp code .m à? Hay quá nhỉ, em chưa làm được như vậy.
     
  7. cuchuoi

    cuchuoi Củ chuối

    Có phải jah dùng mex compiler?
     
  8. jah

    jah Thèm thuồng

    Jah không dùng mex để dịch ra file chạy mà gọi !make bình thường thôi. Dĩ nhiên la trong Makefile, phải thêm các lib của Matlab vào (libeng và libmx). Cụ thể là từng bước làm của Jah như sau:

    1. lấy 1 chương trình c đã được biên dịch tốt, dùng make vì là thông dụng và rất tiện (Trên Window có thể cài MinGW để đồng bộ với Unix hơn là dùng nmake)
    2. thêm một số đoạn code kết nối với matlab
    http://www.mathworks.com/access/hel...desk/help/techdoc/matlab_external/f15075.html
    3. đặt lại giá trị các biến môi trường. Cái này thì tùy system nào mà các bác google ra cách đặt phù hợp.
    4. build thử, và sau đó là có thể làm mọi thứ trên matlab :)
    ------
    Lệnh engEvalString(funcxyz) thì tự động tìm file funcxyz.m ra để thực thi. Và thế là Jah có thể nhúng mọi thứ viết trên matlab vào một system viết bằng c đã có sẵn. :D
     
  9. Tartan

    Tartan n-1 years in Tibet

    Kiểu mix C với matlab này theo mình chỉ để làm chơi chơi với dataset nhỏ nhỏ thôi. Nếu mình không lầm thì matlab có vấn đề với bộ nhớ và đồng thời chạy cũng chậm hơn so với C/C++. Lúc trước nhóm mình có nhúng một đoạn code matlab để xài mấy cái optimization algos được 1 thời gian chạy chậm quá đồng thời không scale up được nên reimplement lại bằng C++ luôn.
     
  10. Coffee

    Coffee Chào Mặt trời bé con ...

    Đúng là Matlab có vấn đề về bộ nhớ đệm. Em không mở được file dữ liệu có dung lượng lớn với Matlab (nhưng đọc được).
    :-?
     
  11. SSL

    SSL Thèm thuồng

    Matlab passes data by values, not by references (e.g., pointers) cho nên thường khi sử dụng Matlab phải tránh dùng large data set, hoặc là phải dùng mex file để viết C trong Matlab. Matlab nhanh hơn C/C++ ở matrix (linear algebra) operations, nhưng rất chậm khi dùng loops. Vì thế khi sử dụng Matlab mình luôn phải cố vectorize và tránh dùng loops một cách tối đa. Một cách nữa hạn chế việc read in large sized variables khi gọi các functions trong Matlab là declare global variables để dùng chung trong tất cả các functions. Mình mới thử call C program from matlab, i.e. using Mex files chứ chưa bao giờ thử call Matlab trong C/C++ programs.
     
  12. cuchuoi

    cuchuoi Củ chuối

    MATLAB có vấn đề với bộ nhớ:
    -Không thể mở file >= 2GB (thỉnh thoảng mình mở file video rất lớn)
    -Stack giới hạn

    Tuy nhiên, MATLAB phù hợp cho fast prototype, bạn có thể kiểm chứng nhanh idea của mình, đặc biệt là tính toán về numerical, matrix thì nhanh hơn C.

    Anyway, nếu dùng C thì cài mấy thư viện numerical cũng ok, nhưng phải develop lâu hơn.
     
  13. ilysm147

    ilysm147 Thèm thuồng

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

    Mình viết đoạn code để gọi Matlab từ C, tuy nhiên khi minh in thi có một nỗi mà mình không biết vì sao, xin nhờ mọi người chỉ giáo.

    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include "engine.h"

    static double Areal[4] = { 1, 2, 3, 4};

    int CallMatlab(double *det)
    {
    Engine *ep;
    mxArray *d = NULL, *MatranA=NULL, *arrayb=NULL;

    MatranA = mxCreateDoubleMatrix(2,2,mxREAL);
    memcpy((char *) mxGetPr(MatranA), (char *) Areal, 4*sizeof(double));

    engPutVariable(ep, "MA", MatranA);

    //tinh determinant
    engEvalString(ep,"deter = det(MA)");
    d = engGetVariable(ep,"deter");
    det = mxGetPr(d); printf("det= %lf \n",*det);getch();
    engClose(ep);

    mxDestroyArray(MatranA);
    mxDestroyArray(arrayb);
    mxDestroyArray(d);

    return(0);
    }

    void main()
    {
    double det=0.0,
    CallMatlab(&det);
    printf("det= %lf\n",det);
    }

    Khi mình in giá trị biến det ở bên trong hàm CallMatlab là -2, trong khi khi ở ngoài hàm main nó bằng 0 thay vì -2. Mình đã thử lại bãngc cách xoá những đoạn code gọi engine Matlab thay vào đó chỉ là cau lệnh gán det=-2 thì kết quả lệnh printf mới về đúng giá trị -2. Như vậy đoạn code về gọi Matlab có vân đề? Bạn nào biết xin chỉ giáo giúp mình mới. Đoạn code trên chỉ là đoạn code đơn giản. Mục đích của mình là muốn trích kết quả mà Matlab giải được để tiếp tục dùng trong C/C++. Các bạn có ý kiến gì xin chỉ giáo giúp mình. Thank you all.
     
  14. loveoflife

    loveoflife Thèm thuồng

    Trong hàm CallMatlab, det là 1 con trỏ (đến 1 mảng kiểu double), do vậy khi bạn gán det = mxGetPr(d) thì bạn đã thay đổi con trỏ đó chỉ đến 1 vùng khác (là vùng nhớ cho d, sau đó sẽ bị xóa trước khi ra khỏi hàm CallMatlab), chứ không hề ghi giá trị ra biến bên ngoài. Đó là lý do vì sao biến det trong main vẫn có giá trị 0 (hoặc 1 junk value nào đó, tùy thuộc vào trình dịch và/hoặc môi trường chạy).

    Để sửa lỗi thì bạn hoặc là return giá trị ra khỏi hàm CallMatlab (dùng return ...) hoặc là sửa lệnh trên thành: *det = *mxGetPr(d);

    Mình không thạo về gọi Matlab từ C/C++ nhưng thấy có mấy điểm "đáng ngờ" trong hàm CallMatlab của bạn:
    + arrayb không được khởi tạo (dùng) mà lại bị xóa trong mxDestroyArray.
    + engine ep không được khởi tạo mà lại bị đóng bởi engClose.
     
    ilysm147 likes this.
  15. theLight

    theLight Thèm thuồng

    Có khả năng các hàm khới tạo này đã có trong "engine.h"? vì gọi matlab còn cần thêm mấy khai báo của nó nữa.:confused:
     
  16. jah

    jah Thèm thuồng

    Bạn thiếu 1 bước là kết nối đến engine:

    if (!(ep = engOpen("\0"))) {
    fprintf(stderr, "\nCan't start MATLAB engine\n");
    return EXIT_FAILURE;
    }
     
  17. ilysm147

    ilysm147 Thèm thuồng

    Đây là lỗi của mình. Mình xóa những đoạn code linh tinh cho đỡ rối mắt cho mọi người dê đọc và thế là xóa luôn những chỗ cần thiết (như engOpen ...)=>gây ra "đáng ngờ".

    Mình đã sửa được lỗi theo chỉ dẫn của bạn. Cảm ơn loveoflife nhiều.
     
    Last edited: Oct 8, 2008
  18. ilysm147

    ilysm147 Thèm thuồng

    Từ C gọi Matlab để giải Convex programming dùng CVX

    Mình muốn giải bài toán convex programming, search trên mạng thấy có CVX (tích hợp vào Matlab). (CVX: Matlab Software for Disciplined Convex Programming).
    Khi mình giải trực tiếp bằng cách gõ lệnh trong Matlab thì OK, tuy nhiên khi minh gọi thông qua chương trình C thì có vấn đề. Đoạn code của mình như sau (còn một đoạn code về value của A và b trước đoạn code này mình xin bỏ qua):

    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();

    //đoạn code dùng CVX giải bài toán convex, đây là đoạn có vấn đề?
    engEvalString(ep, "cvx_begin");
    engEvalString(ep, "variable x(n)");
    cout << buffer;getch();
    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();

    x = engGetVariable(ep,"x");


    engClose(ep);
    mxDestroyArray(x);
    mxDestroyArray(b);
    mxDestroyArray(A);
    return(0);
    }

    Khi mình Compile thì không có lỗi=> chứng tỏ k có lỗi cú pháp C. Như vậy, vấn đề chắc nằm ở chỗ gọi Matlab (rồi thằng Matlab gọi CVX). Mình thêm mấy cái lệnh "cout << buffer;" để kiểm tra Mathlab thông báo gì, thì sau khi chạy đến dòng in đậm thứ nhất nhận được thông báo như sau: "??? Error using ==>variable. A cvx problem does not exist in this scope", và chạy đến dòng in đậm thứ 2 nhận được thông báo "??? Error using ==>cvx_end. No cvx problem exists in this scope".
    Mình đã sai ở đâu? Xin nhắc lại là khi mình thử cũng những câu lệnh này trực tiếp trên Matlab thì CVX giải tốt.
    Các bạn cao tay xin giúp đỡ mình với. Xin chân thành cảm ơn!
     
  19. ilysm147

    ilysm147 Thèm thuồng

    Mình lại mắc thêm một vấn đề khác liên quan đến gọi Matlab, xin mọi người chỉ giáo qua link:
    Ti Convex programming dùng CVX - VietPHD Forum

    Bác jah, bác loveoflive và các bác khác giúp em với.
     
  20. skeptic

    skeptic Thèm thuồng

    theo mình thì bạn nên vào forum của Matlab để hỏi thì sẽ ra vấn đề nhanh hơn nhiều bạn ah.
     

Share This Page