สารบัญ:

การสร้างไฟล์ Matlab MEX: 3 ขั้นตอน
การสร้างไฟล์ Matlab MEX: 3 ขั้นตอน

วีดีโอ: การสร้างไฟล์ Matlab MEX: 3 ขั้นตอน

วีดีโอ: การสร้างไฟล์ Matlab MEX: 3 ขั้นตอน
วีดีโอ: How to Create C++ mex files for MATLAB 2024, กรกฎาคม
Anonim
การสร้างไฟล์ Matlab MEX
การสร้างไฟล์ Matlab MEX

คำแนะนำเกี่ยวกับวิธีการรวมโค้ด C ที่คอมไพล์เข้ากับ Matlab MEX ย่อมาจาก MATLAB ปฏิบัติการ ไฟล์ MEX เป็นรูทีนย่อยที่เชื่อมโยงแบบไดนามิกที่สร้างจากซอร์สโค้ด C หรือ Fortran ซึ่งเมื่อคอมไพล์แล้ว สามารถเรียกใช้จากภายใน MATLAB ในลักษณะเดียวกับไฟล์ MATLAB M หรือฟังก์ชันในตัว ฟังก์ชันอินเทอร์เฟซภายนอกมีฟังก์ชันในการถ่ายโอนข้อมูลระหว่างไฟล์ MEX และ MATLAB และความสามารถในการเรียกใช้ฟังก์ชัน MATLAB จากโค้ด C หรือ Fortran ฉันจะแสดงทุกสิ่งที่คุณต้องการเพื่อสร้างไฟล์ mex ที่มีประโยชน์อย่างรวดเร็ว need:= ตัวแก้ไขข้อความ= matlab 6.1 หรือสูงกว่า (เวอร์ชันก่อนหน้าสามารถทำไฟล์ mex ได้เช่นกัน แต่มีรูปแบบที่แตกต่างกันเล็กน้อย) = matlab มีคอมไพเลอร์ c ของตัวเองที่มาพร้อมกับมัน แต่ฉันใช้คอมไพเลอร์ visual c++ เพราะฉันมีมัน

ขั้นตอนที่ 1: รหัส

รหัส
รหัส

ดาวน์โหลดไฟล์ที่ฉันแนบ: mextest1p0.cpp

cpp ย่อมาจาก c++ ………นี่คือสิ่งที่โค้ดทำ:………… มันใช้ตัวเลขที่คุณส่งจากพรอมต์คำสั่ง matlab มันพิมพ์ "hello world" ใน matlab ส่งคืนอาร์กิวเมนต์สองตัวไปยัง matlab อาร์เรย์ตัวเลขสององค์ประกอบและสตริงที่องค์ประกอบแรกของอาร์เรย์ตัวเลขที่ส่งคืนคือ 1 + หมายเลขที่คุณส่งองค์ประกอบที่สองของอาร์เรย์ตัวเลขที่ส่งคืนคือ 2 + หมายเลขที่คุณส่ง ……….นี่คือวิธีการใช้งาน:………… บันทึกไฟล์ลงในคอมพิวเตอร์ของคุณ เริ่ม matlab นำทางใน matlab ไปยังไดเร็กทอรีที่ไฟล์นั้นถูกปฏิบัติตามคำแนะนำการรวบรวมและดำเนินการที่ด้านบนของ ไฟล์.cpp ฉันไม่สามารถเขียนคำแนะนำเหล่านี้ที่นี่ได้ เนื่องจาก Instrucables จะแก้ไขคำสั่งโดยอัตโนมัติและทำให้ปรากฏอย่างไม่ถูกต้อง ในภาพด้านล่างคุณจะเห็นรหัสทำงาน ไม่ต้องกังวลกับ "คำเตือนบรรทัดคำสั่ง" ดูเหมือนจะไม่มีผลอะไร สังเกตทางด้านซ้าย ไดเร็กทอรีปัจจุบันมีไฟล์.cpp ทางขวามือ คุณจะเห็นว่าฉันกำลังคอมไพล์โค้ดแล้วเรียกใช้งานจาก matlab อ่านไฟล์ในโปรแกรมแก้ไขข้อความของคุณ (เช่น แผ่นจดบันทึกใน Windows) เอกสารนี้ได้รับการจัดทำเป็นเอกสารอย่างดีและอธิบายตนเองได้ คุณจะสามารถทำเกือบทุกอย่างที่คุณต้องการโดยปฏิบัติตามข้อตกลงในโค้ด (เช่น คัดลอกและวางและทำ แก้ไขเล็กน้อย) #################################################### ######################## ……..หมายเหตุ…….. เนื่องจากการแก้ไขอัตโนมัติที่น่ารำคาญซึ่งคำสั่งสอนทำได้ โค้ดตามที่เห็นใน หน้าถัดไปจะไม่ทำงาน คุณต้องดาวน์โหลดไฟล์ที่ฉันแนบมาแทนการคัดลอกและวางสิ่งนี้ ####################################################### ############################

ขั้นตอนที่ 2: นี่คือรหัส ห้ามคัดลอกและวาง

นี่คือรหัส ห้ามคัดลอกและวาง
นี่คือรหัส ห้ามคัดลอกและวาง

####################################################### ########################……..หมายเหตุ……..เนื่องจากการแก้ไขอัตโนมัติที่น่ารำคาญบางอย่างที่คำสั่งทำ รหัสตามที่เห็นในหน้านี้จะไม่ WORK คุณต้องดาวน์โหลดไฟล์ที่ฉันแนบมาแทนการคัดลอกและวางสิ่งนี้####################################### ########################################## // นี่เขียนด้วย c ++ โดย leevonk // เป็นรหัสสำหรับไฟล์ matlab mex//รหัสจะรับค่าตัวเลขหนึ่งค่าและส่งออกค่าตัวเลขสองค่า//ตัวเลขเอาต์พุตทั้งสองจะคำนวณจากหมายเลขอินพุต//รหัสจะส่งออกค่าสตริงด้วย//รหัสจะ ยังพิมพ์ "สวัสดีชาวโลก"#include "mex.h" void mexFunction(int nlhs, mxArray *plhs, int nrhs, mxArray *prhs) {//################ ###############################//#########-- พิมพ์ "สวัสดีชาวโลก"--### #########//########################################## ###mexPrintf("สวัสดีชาวโลก");//##################################### #####//##########--รับสิ่งของจาก Matlab---#########//################ ###############################/ * ประกาศตัวแปรอาร์เรย์เพื่อเก็บค่าขาเข้า */double* InValues;/* รับค่าที่ส่งจาก matlab */InValues = mxGetPr(prhs[0]);/* เพื่อใช้ค่าเหล่านี้ที่ส่งจาก matlab ให้ทำ InValues [0], InValue[1] เป็นต้นตามจำนวนค่าที่มี InValues จะถูกใช้ด้านล่าง *///########################################## ##//##########--ส่งคืนอาร์เรย์ตัวเลข---#########//##################### #########################/* ประกาศอาร์เรย์ที่จะส่งไปยัง matlab (* ทำให้เป็นอาร์เรย์) */double* OutValues;/ * สร้าง/จัดสรรอาร์กิวเมนต์การส่งคืน 1x2 (1 แถว 2 คอลัมน์) เมทริกซ์สำหรับช่องแรกของอาร์เรย์ส่งคืน (plhs[0]) */plhs[0]=mxCreateDoubleMatrix(1, 2, mxREAL); /* รับตัวชี้ไปยังอาร์กิวเมนต์ส่งคืน */OutValues = mxGetPr(plhs[0]); /* กำหนดค่าให้กับ OutValues ซึ่งจะอยู่ในช่องแรกของอาร์เรย์ส่งคืน ที่นี่เราใช้ InValues กับคอมพิวเตอร์ OutValues */OutValues[0] = InValues[0] + 1;OutValues[1] = InValues[0] + 2;//################################################// #############--ส่งคืนสตริง--###############//##################### ############################/* ประกาศตัวแปรสตริงที่จะส่งไปยัง matlab */char* str;/* กำหนดค่าให้กับ string */str = "byebye";/* ใส่สตริงลงในช่อง return arrays ที่สอง (plhs[1]) */plhs[1]=mxCreateString(str);//########## ##################################//###########--กลับ อื่นๆ --############//################################## ###############/* หากต้องการส่งคืนสินค้าเพิ่มเติม ให้ปฏิบัติตามกฎทั่วไปด้านบน แต่ใส่ของลงในช่อง plhs อื่น plhs[somenumber] */ }

ขั้นตอนที่ 3: หากไม่รวบรวมด้วยเหตุผลใดก็ตาม

หากไม่รวบรวมด้วยเหตุผลใดก็ตาม
หากไม่รวบรวมด้วยเหตุผลใดก็ตาม

หากไม่สามารถคอมไพล์ได้ (ควรใช้งานได้ดีบนคอมพิวเตอร์ของฉัน) ไม่ว่าจะด้วยเหตุผลใดก็ตาม แสดงว่าฉันได้เรียนรู้จากแหล่งข้อมูลเหล่านี้ พวกเขามีข้อบกพร่องเล็กน้อย (การใช้ไวยากรณ์ที่เก่าและใช้งานไม่ได้ ฯลฯ) แต่ถ้าคุณกลับไปกลับมาระหว่างทั้งสองคุณควรจะสามารถรวมสิ่งที่ใช้งานได้https://web.ccr.jussieu.fr/ccr/ เอกสารประกอบ/คำนวณ/matlab5v11/docs/00009/009a1.htmhttps://cnx.org/content/m12348/latest/

แนะนำ: