1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

MATLAB sang C

Chủ đề trong 'Điện - Điện tử - Viễn thông' bởi ctech, 06/07/2004.

  1. 1 người đang xem box này (Thành viên: 0, Khách: 1)
  1. ctech

    ctech Thành viên mới

    Tham gia ngày:
    15/05/2003
    Bài viết:
    381
    Đã được thích:
    0
    Chào các bác,
    Có bác nào ở đây biết có thể convert chương trình viết bằng MATLAB sang C/C++ 1 cách nhanh nhất không ạ, chẳng hạn có toolbox nào cho phép convert tự động tương tự như chuyển từ các model simulink sang C/C++? Tôi có đọc help đi kèm về thư viện C/C++ của ML nhưng áp dụng thấy mù mờ quá. Xin được trao đổi kinh nghiệm với các bác đang làm hoặc đã có kinh nghiệm về vấn đề này.
  2. loveoflife

    loveoflife Thành viên mới

    Tham gia ngày:
    09/01/2002
    Bài viết:
    94
    Đã được thích:
    0
    Để convert 1 chương trình MatLab (m-file) sang mã C/C++ bạn có thể dùng lệnh mcc. Tra cứu bằng "help mcc" để biết cách dùng. Nói chung dùng khá đơn giản. Chú ý là không convert được m-script mà chỉ convert được dạng function, tuy nhiên có thể chuyển 1 script thành function khá dễ dàng. Điểm đặc biệt là mcc có thể tạo cả mã graphic, do đó các lệnh plot hoàn toàn làm việc tốt, cửa sổ figure tạo ra khá đầy đủ tính năng như trong MatLab thật.
    Ngoài ra, bạn có thể chuyển mã MatLab thành các COM object rất tiện dùng trong các ngôn ngữ như VB.
  3. imweasel

    imweasel Thành viên quen thuộc

    Tham gia ngày:
    21/07/2002
    Bài viết:
    473
    Đã được thích:
    0
    bác loveoflife nói rõ hơn được không ạ ? Ví dụ như với một chương trình có dùng GUI, có ô nhập dữ liệu riêng sau đó process, vẽ ra đồ thị. Em đã thử dùng mcc nhưng chương trình sau đó mặc dù hiện ra GUI, xong không tài nào nhập dữ liệu và process được. Hình như không phải tất cả các lệnh của matlab đều chuyển tương đương sang C thì phải ?
    @ CTech : việc chuyển này kèm theo chương trình của bác một thư viện khoảng 20 M
  4. ctech

    ctech Thành viên mới

    Tham gia ngày:
    15/05/2003
    Bài viết:
    381
    Đã được thích:
    0
    Vâng, vẫn biết là dùng lệnh mcc như thế nhưng ý mình muốn hỏi là dùng nó thế nào cho đúng và hiệu quả. Chẳng hạn, mình cần generate ra .cpp bằng mcc -p thì gặp mấy vấn đề thế này:
    - Có hàng loạt warning, đại loại như:
    References to "get" require the C/C++ Graphics Library when executing in stand-alone mode. You must specify -B sgl or -B sglcpp in order to use the C/C++ Graphics Library. Also, if using the -W option, you must specify either the mainhg or libhg wrapper type. A run-time error will occur if the C/C++ Graphics Library is not present when "get" is called.
    Ngoài get thì tất cả các references đến rất nhiều thứ khác có liên quan đến đồ hoạ hoặc các toolboxes thông thường như signal processing, statistics... cũng bị tình trạng tương tự. Thực tế là mình rất mù mờ về cơ chế liên kết các thư viện C/C++ mà MATLAB sử dụng khi tạo ra chương trình C++ chạy stand-alone như thế này nên không biết giải quyết những warnings này thế nào. Liệu đem chương trình C++ đã có dịch trong các compiler khác nhau có gặp rắc rối gì không?
    - Thứ 2 là vấn đề file option, file compopts.bat. Mình có tìm hiểu cách viết lại file này cho phù hợp với ý mình nhưng cũng như trên là chẳng hiểu mấy.
    - Thứ 3 là vấn đề Matlab cho ra quá nhiều file .cpp. Thông thường phải mất 15'''' để dịch 1 .m file khoảng dưới 1000 dòng lệnh có sử dụng đồ hoạ và 1,2 toolboxes, kết quả tạo ra khoảng gần trăm .cpp files. Cách đọc, hiểu, sửa và dịch những mã C++ đã được tạo ra bằng 1 chương trình C++ compiler như thế nào khi có quá nhiều file như vậy? Điều này là quan trọng nhất vì mục đích chuyển sang C++ là để sửa các file .cpp nhằm tối ưu hoá simulation.
    - Thứ 4 là mình không hiểu vai trò của DllRegisterServer mwcommgr.dll (lưu trong thư mục bin/win32) như thế nào, rồi cần link thêm nhưng thư viện gì của MatLab khi dịch và liên kết các file .cpp này. Mình đã thử dịch và liên kết các file đã được tạo ra bằng bộ MS Visual Studio.Net nhưng không thành công.
    Mong tiếp tục được sự chỉ bảo của các bạn cùng làm. Mình nghe đâu đó là đã có 1 toolbox được viết để hỗ trợ việc chuyển đổi ML sang C/C++, hình như của 1 third party nào đó, không biết có phải vậy không, nếu đúng xin các bạn cho biết thông tin.
    Được ctech sửa chữa / chuyển vào 20:36 ngày 07/07/2004
  5. imweasel

    imweasel Thành viên quen thuộc

    Tham gia ngày:
    21/07/2002
    Bài viết:
    473
    Đã được thích:
    0
    em cũng đã từng dùng thử cái tool nhỏ nhỏ mà bác nói (bác có thể down dùng thử ở đây, nhưng kết quả của em vẫn chuối, và thắc mắc giống hệt bác.
    Nếu bác phát hiện ra vấn đề thế nào thì post cho em nhé, để lần sau mà có sờ đến thì em còn doạ ông thầy tí
    Được imweasel sửa chữa / chuyển vào 23:54 ngày 07/07/2004
    Được imweasel sửa chữa / chuyển vào 23:57 ngày 07/07/2004
  6. ctech

    ctech Thành viên mới

    Tham gia ngày:
    15/05/2003
    Bài viết:
    381
    Đã được thích:
    0
    Bạn imweasel thân mến, mình đã download thử mcctool mà bạn chỉ. Đáng tiếc đây chỉ đơn giản là tool làm đơn giản hoá cách dùng lệnh mcc mà thôi. Nó không phải là cái toolbox mình mong muốn nhưng dù sao cũng rất cám ơn bạn.
    Nếu bạn đã từng làm việc với Real-Time Workshop Embedded Coder thì sẽ thấy đây là 1 toolbox tuyệt vời để chuyển các model mô phỏng được lập bằng simulink của MATLAB sang C/C++ code và giúp sửa tối ưu hoá C/C++ code để có được những simulation đáp ứng được yêu cầu chạy trong thời gian thực (kết hợp với toolbox Real-Time Workshop nữa). Nếu có được 1 toolbox như vậy để giúp chuyển sang C/C++ code không chỉ các simulink model mà cả các .m file thì tuyệt quá. Thực sự thì MATLAB có cung cấp toolbox MATLAB compiler (mà mcc thuộc toolbox này) phục vụ cho mục đích chuyển đổi và dịch các .m files thành các chương trình độc lập chạy ngoài MATLAB nhưng có lẽ nó chỉ dừng lại ở đó chứ chưa đáp ứng được yêu cầu của người dùng khi muốn chỉnh sửa thêm.
  7. imweasel

    imweasel Thành viên quen thuộc

    Tham gia ngày:
    21/07/2002
    Bài viết:
    473
    Đã được thích:
    0
    em nghĩ bọn Mathworks khó mà cũng cấp một cái tương tự để còn bán hàng. Em chưa làm với cái toolbox embedđe bao giờ (sắp tới có thể) còn đọc kỹ phần doc của mcc (chính là matlab compiler ? ) thì em thấy nó k support tất cả các lệnh thông thường của matlab. Không hiểu là đã có ai chuyển đổi thành công một chương trình cỡ gồm cả GUI và các file .m ở ngoài hay chưa ?
  8. loveoflife

    loveoflife Thành viên mới

    Tham gia ngày:
    09/01/2002
    Bài viết:
    94
    Đã được thích:
    0
    Dạo này bận quá nên hôm nay mới trả lời các bác được.
    Tôi đã dùng thử mcc và nhận xét của tôi là rất tốt. MCC có thể dịch hầu như tất cả các chương trình viết trong ML sang C/C++, kể cả các chương trình dùng graphics và GUI. Tuy nhiên dùng mcc không thật dễ và trước khi dùng các bác nên đọc thật kĩ document (điều này cũng giống như tất cả các phần khác trong ML thôi). Tôi xin trả lời qua 1 số câu hỏi của các bác. Còn lại các bác phải đọc help thật thật kĩ lưỡng.
    1) trước khi bắt đầu dùng mcc, các bạn cần cài đặt trình biên dịch cho ML. Cũng dùng MEX -SETUP thôi. Tôi dùng VC++ 6.0
    2) MCC có thể dịch .m sang C/C++ (và 1 số ngôn ngữ khác) cho nhiều mục đích khác nhau, như standalone apps, C-MEX, COM,... Các bác phải xác định rõ mình định dùng loại nào để đặt tham số cho phù hợp.
    3) Không phải tất cả các lệnh trong ML đều chuyển được. Có 1 danh sách các lệnh không chuyển được ở trong help. Tuy nhiên nếu mcc dịch và gặp các lệnh này thì nó sẽ thông báo.
    4) Tôi đã dịch thử các chương trình dùng graphics và GUI và mọi chuyện đều suôn sẻ. Bạn gì đó gặp vấn đề về thư viện đồ hoạ thì thử xem lại cấu hình lúc cài đặt ML xem. Có thể thiếu phần thư viện này.
    5) MCC tạo ít hay nhiều file là phụ thuộc vào chương trình m-file. + Thứ nhất, trong m-file của bạn có thể gọi nhiều m-file (tự viết) khác nhau, vì vậy MCC phải dịch tất cả các m-file liên quan này. Chính các m-file này lại liên quan đến những m-file khác nữa như 1 phản ứng dây chuyền. Từ 1 m-file vì vậy sẽ liên quan đến vài, thậm chí hàng chục m-file khác.
    + Mỗi hàm (có sẵn) bạn dùng trong 1 m-file mặc dù có sẵn trong thư viện (lib) nhưng để trình dịch C/C++ hiểu được thì cần phải có declaration tương ứng trong file .h. Vì vậy mỗi hàm (có sẵn) được dùng sẽ được MCC sinh ra ít nhất 1 file .h. Nếu bạn dùng hàng trăm hàm như vậy thì có hàng trăm file .h là chuyện bình thường.
    6) Về vấn đề GUI bạn không hoạt động thì do bạn đã mắc phải 1 lỗi đã nêu trong docs của MCC. GUI trong ML dùng callback function, cho dưới dạng 1 string. Khi 1 sự kiện xảy ra, lệnh/hàm tương ứng trong string này được thực thi. Cơ chế này hoạt động tốt trong trình thông dịch. Nhưng bạn hãy thử đóng vai là trình dịch MCC xem. Làm sao bạn biết được 1 string là string thực sự (tên người chẳng hạn) hay lệnh ML. MCC chỉ biết dịch các string này như những string bình thường. Vấn đề là nếu như callback của bạn có gọi 1 hàm để xử lý 1 sự kiện GUI nhưng hàm này không được MCC biết đến, vì vậy không được chuyển sang mã C/C++ và cũng không được dịch/liên kết, khi đó sự kiện GUI này sẽ không được xử lý. Đó chính là lý do mà GUI của bạn đứ đừ. Để khắc phục, bạn phải dùng pragma (quên mất rồi, hình như là %# hay %? gì đó, tra lại help xem) để báo cho MCC biết rằng, "hàm xyz này tuy không xuất hiện trực tiếp trong m-file nhưng sẽ được dùng, vì vậy cứ dịch đi". Điều tương tự cũng xảy ra với các callback trong ODE.
    7) Còn gì nữa nhỉ??? Quên mất rồi, nếu có gì tôi sẽ trả lời tiếp trong bài sau. Thế đã nhé !!!
  9. bkhk98

    bkhk98 Thành viên mới

    Tham gia ngày:
    30/01/2002
    Bài viết:
    19
    Đã được thích:
    0

    Chào các bạn,
    Hôm nay tình cờ mình đọc được topic này.. thấy ''nóng máu'' quá.. Chẳng là cách đây mấy tháng mình cũng điên đầu với cái chuyện convert Matlab code into C/C++.. nên cũng có 1 số kinh nghiệm muốn trao đổi với các bạn...
    Mình thấy ý kiến của bạn loveoflive là khá hoàn chỉnh rồi..mình chỉ xin bổ sung thêm 1 vài ý kiến nhỏ.
    1. Bạn nên viết thử 1 đoạn chương trình nhỏ.. sau đó dùng lệnh mcc với các thông số khác nhau, thay đổi Matlab code,.. thì sẽ thấy được sự khác biệt giữa các lệnh rõ hơn.. Tôi khá ngạc nhiên khi dùng lệnh save trong Matlab, đến khi convert ra *.exe -> run thì vẫn tạo ra được 1 file lưu kết quả... - Bạn thử xem..
    Sau khi dùng mcc thành công với small program bạn mới dùng mcc với chương trình lớn của bạn.. như vậy đỡ mất time hơn..
    2. Mình cũng không rõ bạn ctech khi dịch chương trình thì bị lỗi như thế nào.. nhưng khi convert chương trình mà có sử dụng các lệnh đồ hoạ thì bạn nên thêm vào thông số..sglcpp
    mcc ?"m ?"B sglcpp -> Create Stand-alone C++ graphics library application + .EXE
    3. Như bạn loveoflive nói.. khi convert ra file *.exe chạy rất ngon lành - chẳng gặp vấn đề gì cả.. Theo mình để ý thì chương trình sau khi convert chạy chậm hơn *.m khoảng 30%.
    4. Vd chương trình bạn viết gồm 20 files *.m. Bây giờ bạn thử tạo 1 func duy nhất (vd run.m) trong đó copy tất cả 20 files nói trên.. (chỉ việc cut and paste thôi) -> sau đó dùng lệnh mcc.. (mình không nhớ rõ thông số kèm theo nhưng hình nhừ file *.cpp tạo ra ít hơn thì phải).
    5. Có 1 cách để dùng chương trình viết bằng Matlab có thể dùng trong C++. Đó là dùng mcc để chuyển *.m thành 1 thư viện *.dll.. Hic.. tớ có vào thư viện (hic..không phải ở VN) kiếm được 1 cuốn sách cực hay (tác giả VN nhưng viết bằng tiếng Anh), minh hoạ rất rõ ràng về chuyện này.. làm theo khá đơn giản.. Tớ còn ''lén'' copy file *.pdf của sách (12MB).. nhưng kô dám share cho anh em đâu - hic.. vi phạm bản quyền.. Rãnh rỗi tớ sẽ tóm tắt rồi trình bày lên đây.. Đại loại là có 5 bước.. Cái lệnh căn bản nhất để convert là:
    mcc -t -L C -W lib:allfilelib -T link:lib allfile.m libmmfile.mlib
    allfile là tên file *.m của bạn.. bạn dịch thử sẽ thấy nó chỉ ra 1 vài file *.c thôi + file *.dll + *.lib.. cách sử dụng chính xác thì trình bày hơi dài..
    Thú thật là có lúc lo lắng, trăn trở khi convert 1 Matlab code sang C/C++ thì mới hiểu được nỗi lòng của bạn ctech..hihi..
    Chúc bạn sớm giải quyết vấn đề nhé..
  10. imweasel

    imweasel Thành viên quen thuộc

    Tham gia ngày:
    21/07/2002
    Bài viết:
    473
    Đã được thích:
    0
    giá mà hồi em làm gặp các bác sớm, hic . Đúng như các bác đã nói, vấn đề là phải đọc kỹ documentation của matlab cho mcc vì k fải lệnh nào nó cũng dịch . Hồi đấy em gò lưng ngồi làm đến khi chương trình khoảng hơn 600 K rồi mới bắt đầu tìm hiểu về mcc thành ra có muốn hối cũng k kịp (còn có 2 ngày nữa là nộp) . Báo cáo em đã save đầy đủ các comment của các bác để sau này còn chiến tiếp

Chia sẻ trang này