周世欽+王波濤
摘要:通過MATLAB程序轉(zhuǎn)C代碼的研究與應(yīng)用可以加快軟件、算法從研究到實際應(yīng)用的進程,提高軟件、算法研發(fā)的效率。對于轉(zhuǎn)C的流程、方法、注意事項以及限制等問題需要深入研究。以MATLAB2014的轉(zhuǎn)C工具MATLAB Coder為基礎(chǔ),分析了MATLAB轉(zhuǎn)C代碼的細節(jié),完整地研究了MATLAB代碼轉(zhuǎn)成C代碼的整體流程。通過合理的轉(zhuǎn)C規(guī)范,MATLAB支持常規(guī)算法和大多數(shù)工具庫函數(shù)轉(zhuǎn)C,保持原功能、邏輯不便。使用動態(tài)預(yù)分配內(nèi)存,外置接口,簡化函數(shù)等方法,使得一部分非常規(guī)算法、不支持轉(zhuǎn)C或限制性MATLAB函數(shù)能夠正確轉(zhuǎn)化為C語言代碼。
Abstract: The research and application that MATLAB program transforming to C code can expedite the progress from algorithm or software research to practical application and improve the efficiency of software or algorithm development. These problems about transformation's processes, methods, points for attention, limitation and so on need to be further researched. Based on MATLAB Coder of Matlab2014 tool for transforming to C, it analyses details of MATLAB transforming to C code and its whole process. With reasonable transformation specification, MATLAB support general algorithm and most tool functions to transform to C code, which retain intrinsic function and logic. Using some methods such as dynamically pre-allocating memory, external interface and simplifying functions, it also makes a part of uncommon algorithm and MATLAB tool functions which are not support to transform to C or have transformation limitation possible to successfully transform to C language code.
關(guān)鍵詞:Matlab轉(zhuǎn)C;Coder;代碼規(guī)范;轉(zhuǎn)C流程;轉(zhuǎn)C限制
Key words: Matlab transformingto C;Coder;code specification;transformation process;transformation limitation
中圖分類號:TP311 文獻標(biāo)識碼:A 文章編號:1006-4311(2018)02-0182-04
0 引言
目前,利用Matlab軟件[1]作為工具來進行算法設(shè)計、驗證已經(jīng)成為研究者們首選的手段之一[2],而通過Matlab轉(zhuǎn)C,可以直接將Matlab函數(shù)轉(zhuǎn)換成高效優(yōu)化的C程序,移植到嵌入式環(huán)境中去[3]。
Matlab Coder工具是MathWorks公司推出的Matlab2014a版本中一個重要的產(chǎn)品[4],它可以將Matlab 函數(shù)直接生成C代碼[5]。借助Matlab Coder,軟件工程師不再需要將設(shè)計的算法進行C語言重新編程,而是利用Matlab軟件中強大的函數(shù)庫[6],按照通用的轉(zhuǎn)C流程,參照轉(zhuǎn)C規(guī)范,通過建立Matlab函數(shù),并設(shè)置目標(biāo)語言所需要的參數(shù),生成能夠脫離Matlab環(huán)境獨立運行的C代碼,這樣就大大減輕了軟件工程師的編碼工作[7]。
對于基于Matlab2014a版本Coder的Matlab轉(zhuǎn)C,本文介紹經(jīng)過實踐的、行之有效的轉(zhuǎn)C方案與流程,并將轉(zhuǎn)C中遇到的問題與解決方法、思路在下文中進行介紹,以助于更好的實現(xiàn)轉(zhuǎn)C工作。文章接下來的一節(jié)將詳細介紹Matlab程序整體轉(zhuǎn)C代碼流程。對于轉(zhuǎn)C過程中的幾個常遇問題及其處理方法,將在隨后的一節(jié)中羅列出來并給出詳細說明。實際轉(zhuǎn)C過程中,可能會存在障礙和一些限制,對此,創(chuàng)新性地通過動態(tài)預(yù)分配內(nèi)存,外置接口,簡化函數(shù)等方法化解,在文章的最后一節(jié)將會對此進行詳細說明。
運用matlab轉(zhuǎn)C方法,可以方便、快捷、準(zhǔn)備地將matlab算法轉(zhuǎn)化成C語音實現(xiàn),使之運用在嵌入式環(huán)境成為可能。通過本文的詳細介紹,能夠使讀者對于使用matlab coder工具進行matlab轉(zhuǎn)C有更加直觀、系統(tǒng)的認識;引導(dǎo)讀者正確使用2014a版本的matlab coder進行matlab轉(zhuǎn)C工作;為從matlab算法設(shè)計、仿真、驗證到算法的C語言實現(xiàn)、嵌入式環(huán)境應(yīng)用提供了一條切實可行的途徑;同時,文章中也著重列出了多項技術(shù)要點,是轉(zhuǎn)C工作順利進行和是否成功的關(guān)鍵所在,對實際matlab轉(zhuǎn)C工作有著重要的借鑒意義。但也應(yīng)當(dāng)了解到, Matlab轉(zhuǎn)C依然存在著無法解決的情況,這些情況并不在本文討論范圍之內(nèi),故應(yīng)盡量避開之,或者,隨著Matlab Coder的升級,某些問題可隨之化解。
1 Matlab程序整體轉(zhuǎn)C代碼流程
借助Matlab Coder轉(zhuǎn)C有其一定的步驟與要求規(guī)范,Matlab2014a版本Matlab Coder的轉(zhuǎn)C流程如圖1所示,以及其重要的幾步工作如下所述。簡單的Matlab函數(shù)經(jīng)過簡單的調(diào)整,經(jīng)過如下步驟和要求就能成功轉(zhuǎn)C,而面對復(fù)雜的情況時,除了要按照上述流程嚴(yán)格執(zhí)行外,還要根據(jù)具體情況做出相應(yīng)的修改才能達到某些步驟的要求。endprint
1.1 封裝Matlab函數(shù)
將Matlab程序所要實現(xiàn)的功能封裝成一個Matlab函數(shù)文件,并將其所實現(xiàn)的功能結(jié)果作為函數(shù)輸出,將所需的數(shù)據(jù)作為輸入,再將整個函數(shù)的代碼進行規(guī)范,以此作為轉(zhuǎn)C函數(shù)。對于Matlab程序,腳本文件[8]是無法通過Coder 工具轉(zhuǎn)成C代碼的,只有函數(shù)文件能通過Coder工具轉(zhuǎn)成C。
轉(zhuǎn)C前要對函數(shù)代碼進行轉(zhuǎn)C規(guī)范。大部分不符合規(guī)范的代碼都可以通過代碼分析器檢測出來(編譯文本框的左側(cè)有對應(yīng)的提示),可通過此依次做出相應(yīng)的修改,以達到轉(zhuǎn)C要求。小部分是代碼分析器檢測不到的,需要自己發(fā)現(xiàn)或者轉(zhuǎn)C編譯報錯時才能從錯誤報告中找到,并對其進行規(guī)范。完成規(guī)范之后才能通過Matlab Coder進行轉(zhuǎn)C。
1.2 函數(shù)整體分析
利用Code Generation Readiness Tool整體分析函數(shù)是否符合轉(zhuǎn)C要求。此步驟主要檢查轉(zhuǎn)C函數(shù)中是否調(diào)用了不支持轉(zhuǎn)C的Matlab函數(shù)或Matlab對象[9](如:數(shù)據(jù)類型),Matlab編程[10]是否正確,是否存在嵌套調(diào)用等不符合轉(zhuǎn)C要求規(guī)范的算法,但是,不檢查語法細節(jié)是否符合轉(zhuǎn)C要求規(guī)范。
對于檢測出的、不符合轉(zhuǎn)C要求的,只能對Matlab程序的算法進行修改,去除不符合要求的部分,甚至要對部分算法的功能進行調(diào)整、取舍。
1.3 庫函數(shù)轉(zhuǎn)C限制檢查
確定轉(zhuǎn)C函數(shù)中調(diào)用的Matlab庫函數(shù)是否存在轉(zhuǎn)C限制??梢圆榭碝atlab幫助文檔中的轉(zhuǎn)C函數(shù)支持列表,對照的查看是否存在轉(zhuǎn)C限制的Matlab工具函數(shù)。若調(diào)用的Matlab函數(shù)存在轉(zhuǎn)C限制,并且調(diào)用時沒有遵循這個限制,則無法轉(zhuǎn)C。
1.4 建立轉(zhuǎn)C工程并運行
創(chuàng)建轉(zhuǎn)C工程,加載需要轉(zhuǎn)C的功能函數(shù),設(shè)定輸入變量的數(shù)據(jù)類型及其大小,選擇轉(zhuǎn)C后代碼的輸出形式,點擊“編譯”或“Run”即可開始執(zhí)行轉(zhuǎn)C。創(chuàng)建轉(zhuǎn)C工程時,創(chuàng)建的轉(zhuǎn)C工程和需要轉(zhuǎn)C的功能函數(shù)都應(yīng)存放在當(dāng)前Matlab工作路徑下。
1.5 轉(zhuǎn)C錯誤檢查與修改
轉(zhuǎn)C出現(xiàn)錯誤,點擊“Open error report”或“View Report”打開錯誤報告,找到首條錯誤報告并查看錯誤信息和出錯代碼位置,根據(jù)相關(guān)信息提示修改或規(guī)范源代碼,使得其在不改變源代碼功能邏輯的情況下符合轉(zhuǎn)C 規(guī)范,保存后再次進行轉(zhuǎn)C編譯。以此重復(fù)類推來逐個消除轉(zhuǎn)C錯誤,直到最終成功完成轉(zhuǎn)C編譯。
1.6 轉(zhuǎn)C成功
成功完成轉(zhuǎn)C。點擊 “View Report”打開轉(zhuǎn)C結(jié)果報告,可以查看到數(shù)據(jù)類型等的轉(zhuǎn)C相關(guān)信息,也羅列了轉(zhuǎn)C的輸出文件。在轉(zhuǎn)C工程路徑下會有個codegen文件夾,里面根據(jù)文件輸出類型和轉(zhuǎn)C工程名新建文件夾,存放著相關(guān)輸出的文件,其中.c和.h文件為輸出的C代碼文件,與Matlab源代碼同名文件為其主調(diào)函數(shù)文件。
1.7 代碼驗證
對于轉(zhuǎn)出的C代碼正確與否,coder提供的方法是生成mex文件用于驗證,但是mex驗證不成功時,又無法通過其分析原因所在。對此,不再用mex函數(shù)驗證,直接以代碼驗證的方式進行。其主要解決的問題是,代碼驗證不通過時,可以同步分析C程序和Matlab程序以找出轉(zhuǎn)C失敗原因。
新建一個C語言工程用于調(diào)用轉(zhuǎn)C后的功能函數(shù)C語言代碼,產(chǎn)生結(jié)果并和用Matlab運算產(chǎn)生的結(jié)果進行比較,如果結(jié)果一樣或者誤差在合理范圍內(nèi),則說明轉(zhuǎn)C成功,轉(zhuǎn)出的C代碼功能完整,邏輯正確,可直接使用。如果結(jié)果不一致、誤差極大,則說明轉(zhuǎn)C出現(xiàn)問題,可單步運行C程序和Matlab程序,看誤差最先出現(xiàn)在那里,并分析是什么原因造成的,修改或規(guī)范它,然后再進行轉(zhuǎn)C編譯和代碼驗證,直到二者結(jié)果一致或者誤差在合理范圍內(nèi)為止。代碼驗證時,C程序和Matlab程序用的輸入應(yīng)當(dāng)一致,并用多組數(shù)據(jù)進行驗證。如果有必要,也可以將程序運行中的、有代表性的對應(yīng)數(shù)據(jù)進行比較,以此確保轉(zhuǎn)出的C程序功能、邏輯與源代碼一致。
2 轉(zhuǎn)C過程常遇問題及處理方法
轉(zhuǎn)C過程中會遇到諸如不符合Matlab Coder轉(zhuǎn)C規(guī)范的語句、對程序進行轉(zhuǎn)C規(guī)范時,不符合程序功能邏輯的修改、Matlab和C語言的編程差異[11]導(dǎo)致的轉(zhuǎn)C問題、Matlab轉(zhuǎn)C適應(yīng)性問題與限制性問題、以及轉(zhuǎn)C對Coder 工具的影響等諸多方面的問題,甚至有些問題不能得到反饋,需自己察覺與分析。
根據(jù)Matlab轉(zhuǎn)C過程遇到的一些特別的情況總結(jié)的一些轉(zhuǎn)C細節(jié)概述以及對此做出的一些處理,在此列出僅供參考,以避免遇到此情況。
2.1 統(tǒng)籌編程
如果計劃要將所編寫的Matlab程序轉(zhuǎn)成C代碼,那么在設(shè)計算法之初,就一定要先參考轉(zhuǎn)C流程步驟的第二部和第三步,否則就有可能出現(xiàn)完成了算法設(shè)計卻無法轉(zhuǎn)成C代碼的窘境。若到轉(zhuǎn)C時才發(fā)現(xiàn)這些問題再去改,則有可能需要對算法進行重新設(shè)計,改動量較大,甚者是無法修改的情況。
2.2 數(shù)據(jù)類型變化
Matlab變量轉(zhuǎn)C過程中,變量的第一次調(diào)用(多為賦值語句,并為非可忽略語句),決定了它在C語言中的數(shù)據(jù)類型。如果在Matlab程序中,由于引用賦值(如下面第2)行語句)而導(dǎo)致它的類型發(fā)生變化,那么,則在轉(zhuǎn)C過程中就會報錯,這是由于Matlab和C語言的編程差異導(dǎo)致的[11]。Matlab程序中變量的數(shù)據(jù)類型可以發(fā)生改變,而C語言程序中卻不可以。這樣,變量a就從double變量變成了復(fù)數(shù)變量了。這樣的情況在轉(zhuǎn)C中會報錯。
2.3 if語句轉(zhuǎn)C
轉(zhuǎn)C時,Matlab程序中的if語句后面不能是非標(biāo)量的形式(如數(shù)組或結(jié)果為數(shù)組的表達式),否則報錯。Matlab中,if后面的非標(biāo)量,只有當(dāng)全體為真時才認為是真(true),否則為假(false),所以轉(zhuǎn)C時可以據(jù)此做一定的的修改,使得if后面為一個值的標(biāo)量即可。endprint
2.4 被忽略的變量
Matlab程序中,會被“忽略”的變量需要事先“聲明”,即預(yù)分配內(nèi)存[12],否則會出錯。Matlab程序可以在運算中動態(tài)新增變量,有些變量雖然寫在代碼中,但是可能由于沒有執(zhí)行到這段代碼,所以內(nèi)存中也就沒有出現(xiàn)這個變量,即被“忽略”了。但是在轉(zhuǎn)C過程中,這些變量卻要求事先“聲明”,這是Matlab與C語言編程差異導(dǎo)致的。
轉(zhuǎn)C時會報錯第7)行變量a33未被聲明過,因為第5)行變量賦值語句在選擇語句中,屬非一定執(zhí)行語句,所以被“忽略”了。
2.5 變量信息問題
把某項數(shù)據(jù)固定的寫在Matlab函數(shù)的變量中,則轉(zhuǎn)出的C代碼中,這個變量的信息(長度,數(shù)據(jù)類型等)都是固定了的,若在Matlab程序中對這個變量的信息有修改,則這些修改未必會反映到轉(zhuǎn)C中,如果錯誤使用這些信息,將導(dǎo)致程序邏輯錯誤。其他問題導(dǎo)致的變量信息修改未反映到轉(zhuǎn)C中也會出現(xiàn)這樣的情況。
2.6 錯誤的預(yù)分配內(nèi)存
錯誤的預(yù)分配內(nèi)存會導(dǎo)致轉(zhuǎn)出來的的C代碼邏輯錯誤,即Matlab轉(zhuǎn)的C代碼中,某些算法的運行結(jié)果、次數(shù)、或者數(shù)值等出現(xiàn)偏差,從而導(dǎo)致和原來的Matlab程序最終結(jié)果不一致。分配過多有可能會造成預(yù)分配內(nèi)存前后的Matlab程序運行邏輯不一致,這屬于錯誤的轉(zhuǎn)C規(guī)范。分配過少則有可能導(dǎo)致Matlab轉(zhuǎn)出來的C程序邏輯錯誤,甚至轉(zhuǎn)出來的C程序在運行時會出現(xiàn)堆棧溢出[13]的現(xiàn)象。
多分配會導(dǎo)致原來的變量冗余,從而有可能導(dǎo)致后面的算法偏離原先設(shè)計。如果多分配內(nèi)存是無法避免的,那么也可以在后面的算法中,加入修正語句,或避開這些冗余量的影響,也可以達到正確效果。預(yù)分配內(nèi)存過少,則在轉(zhuǎn)C的C代碼后初始化這個變量時會保留錯誤的該變量信息(如數(shù)組長度,數(shù)據(jù)類型等)和申請內(nèi)存不足,如果后面的算法使用了這些錯誤的信息,則程序運行時會偏離原先設(shè)計,甚至?xí)锌赡茉浇缭L問內(nèi)存而導(dǎo)致C程序運行時堆棧溢出。所以應(yīng)避免預(yù)分配內(nèi)存過少。
2.7 轉(zhuǎn)C致軟件崩潰
Matlab函數(shù)的轉(zhuǎn)C致使Matlab軟件崩潰,直接退出Matlab軟件程序的情況。這樣的情況不常遇見,但很棘手,是轉(zhuǎn)C的一大障礙。這個故障無法通過反饋分析原因,只能一次次調(diào)整程序試出來怎樣的形式才不至于Matlab崩潰。在實踐中發(fā)現(xiàn),Matlab崩潰似乎和復(fù)數(shù)或復(fù)數(shù)表達式作為參數(shù)調(diào)用其它函數(shù)再轉(zhuǎn)C有關(guān)。所以,建議轉(zhuǎn)C的函數(shù)盡量避免用復(fù)數(shù)作為參數(shù)參與調(diào)用,改用實部虛部做參數(shù),而后在函數(shù)內(nèi)合成復(fù)數(shù)的方式。另外,避免用作參數(shù)的變量重新賦值,尤其是改變長度的幅值。
3 轉(zhuǎn)C特殊處理辦法
3.1 動態(tài)預(yù)分配內(nèi)存
提供了一種預(yù)分配內(nèi)存的思路,具體是,下一步的預(yù)分配內(nèi)存,是要根據(jù)上一步的結(jié)果來做出操作的,所以這樣需要預(yù)分配的內(nèi)存長度是未知的。這種情況下,用一個變量作為參數(shù)來預(yù)分配合適長度的內(nèi)存。而這個變量的值,則根據(jù)上一步運算結(jié)果和算法要求而得到。如此,轉(zhuǎn)出來的C程序就可以根據(jù)實際算法運算情況來預(yù)分配不同長度的“變量”,而不是固定長度的數(shù)組。
預(yù)分配內(nèi)存是Matlab函數(shù)轉(zhuǎn)C前,規(guī)范Matlab代碼時一步重要的工作。轉(zhuǎn)C時,大部分的變量都是依照“第一次賦值語句”來聲明變量的,而部分變量在Matlab里的第一次出現(xiàn)卻不是賦值語句,而是循環(huán)語句里的引用賦值語句(例如:a(i)=i)。這樣的情況在Matlab程序中會實時地自動生成和加長對應(yīng)的變量(即會根據(jù)算法迭代而增加變量長度),而轉(zhuǎn)C過程卻無法適應(yīng)這種情況,所以要求對這個變量先預(yù)分配內(nèi)存。預(yù)分配內(nèi)存的方法是在其調(diào)用之前加一句相對應(yīng)賦值語句,以起到“第一次賦值語句”的作用。如果這里的“變量”長度是不固定的,則可以采用動態(tài)預(yù)分配內(nèi)存方式。
3.2 外置接口轉(zhuǎn)C
避開某些轉(zhuǎn)C限制的特殊處理方法,一種妥協(xié)思維。Matlab自帶的Coder轉(zhuǎn)C工具有其支持轉(zhuǎn)C函數(shù)庫,包括大多數(shù)普通常用的函數(shù)和信號處理函數(shù)。然而,有些函數(shù)在Matlab轉(zhuǎn)C過程中卻有不同的限制。
重采樣[14]是很多算法和系統(tǒng)中的重要環(huán)節(jié)。在設(shè)計算法之時,一般使用Matlab信號處理的resample函數(shù),然而其在轉(zhuǎn)C時卻有重采樣數(shù)據(jù)的長度必須為一個確定值,上、下采樣率必須為確定值的常量。在很多算法或系統(tǒng)中,需要重采樣的數(shù)據(jù),其長度是不確定的。對于這個情況,設(shè)定一個預(yù)分配內(nèi)存足夠大的另一個“變量”,充當(dāng)外置接口,專門作為resample的參數(shù),把需要處理的數(shù)據(jù)值轉(zhuǎn)移到其中,多余的部分忽略(相當(dāng)于補0值),然后對整體做處理、轉(zhuǎn)C,最后再從結(jié)果中提取出有用的部分(對應(yīng)有用輸入?yún)?shù)部分的結(jié)果)即可。
經(jīng)過驗證,確認了這一方法的可靠性,多余部分(補0值的部分、非有用部分)的存在不影響前面的有用輸入?yún)?shù)部分的運算結(jié)果,從整體結(jié)果中取出的有用結(jié)果與單單輸入有用參數(shù)所得到的結(jié)果相同。通過這種方式,使得在一定數(shù)據(jù)長度內(nèi),既能滿足resample轉(zhuǎn)C的這項限制要求,又適應(yīng)了不同長度數(shù)據(jù)作為輸入的情況。當(dāng)然這里不同的長度的數(shù)據(jù)只要不超過前面所說的“一定長度”即可。
3.3 簡化函數(shù)
通過對Matlab某些不支持轉(zhuǎn)C的函數(shù)進行簡化函數(shù)處理(去除冗余語句),使得它需要的部分功能可以轉(zhuǎn)C。但是,并不是所有的不支持轉(zhuǎn)C函數(shù)都能通過這種方式從而能轉(zhuǎn)C,只是個別函數(shù)能實現(xiàn)。
一些不支持轉(zhuǎn)C的函數(shù),可能為了適應(yīng)多種情況而使用了一些不支持轉(zhuǎn)C的方法,為了能夠轉(zhuǎn)C,將這些方法去除或替換。但是這樣一來,原函數(shù)的功能就有一定程度上的削弱或缺失。如果,可以確定這些削弱或缺失的功能是算法中所不需要的,那么就可以放心的通過這樣的處理方式以使得程序能夠轉(zhuǎn)C,不然,無法通過這種方式使得這個函數(shù)能夠轉(zhuǎn)C。整個流程很簡單,關(guān)鍵是要自己摸索著查找修改點,然后對其進行正確的簡化操作,并確定這樣子的操作不會對整個算法有影響。endprint
Matlab庫函數(shù)中的medfilter1、lpc函數(shù)是不支持轉(zhuǎn)C的,通過上述思路調(diào)整后得以轉(zhuǎn)C,到達設(shè)計要求。以lpc函數(shù)為例,大致介紹簡化函數(shù)轉(zhuǎn)C流程:
①在matlab庫函數(shù)相應(yīng)的文件夾下找到lpc函數(shù),將其復(fù)制到當(dāng)前工程目錄下;
②再用Code Generation Readiness Tool對matlab函數(shù)整體分析;
③提示lpc函數(shù)中try/catch語句不支持轉(zhuǎn)C。
④進入工程目錄下的lpc函數(shù),將try/catch相關(guān)語句去掉并保存,通過可行性分析后再轉(zhuǎn)C。
⑤再比較matlab程序和C程序的結(jié)果,得以驗證這樣操作能夠滿足要求。
4 結(jié)束語
Matlab程序轉(zhuǎn)C代碼是一項集工程創(chuàng)建、代碼規(guī)范[15]、錯誤分析與修正、對比驗證于一身的工程,有其一套行之有效的工作流程和解決方案。符合轉(zhuǎn)C條件的Matlab程序,通過Matlab Coder工具,按照轉(zhuǎn)C流程進行操作能夠?qū)⑼暾鸐atlab程序轉(zhuǎn)成C代碼。通過Matlab程序的轉(zhuǎn)C,縮短了算法研發(fā)與實際應(yīng)用之間的距離,提高了工程師的研發(fā)效率。本文研究了MATLAB程序轉(zhuǎn)C代碼的方法,介紹了以Matlab2014a版本Coder為基礎(chǔ)的轉(zhuǎn)C流程,給出了轉(zhuǎn)C注意事項與處理意見,并且針對一些以前沒有解決辦法的轉(zhuǎn)C阻礙提出了創(chuàng)新性的解決思路與方法。但是也應(yīng)看到,Matlab轉(zhuǎn)C也并不是包治百病的,除了轉(zhuǎn)C流程第二第三步提到的限制外,在Matlab編程中還應(yīng)該注意到Matlab和C語言的編程差異以及適應(yīng)性問題[11],這些都在一定程度上限定了Matlab算法編程。同時,我們可以看到,通過對某些轉(zhuǎn)C限制進行某種“妥協(xié)”,也可以繞開這樣的限制,以達到我們的目的。
參考文獻:
[1]印金國.遙控信號調(diào)制與Matlab程序?qū)崿F(xiàn)[J].電腦編程技巧與維護,2006(10):25-29.
[2]劉浩,韓晶.MATLAB R2014a完全自學(xué)一本通[M].北京:電子工業(yè)出版社,2015.
[3]廖燦燦,張樹群,雷兆宜.Matlab Coder生成C代碼的研究與應(yīng)用[J].計算機與現(xiàn)代化,2013(3):175-178.
[4]Online MATLAB. MATLABR2014a,MATLAB Coder[EB/OL],http:/ /www.mathworks.cn /products /matlab-coder/,2014-10-10.
[5]Online MATLAB.從 MATLAB 代碼生成 C 和 C++ 代碼[EB/OL]https://cn.mathworks.com/products/matlab-coder.html,2014-10-10.
[6]李???基于MATLAB函數(shù)庫增強VB數(shù)值計算能力的研究[J].計算機工程與應(yīng)用,2003,39(23):57-59.
[7]陸楠.自動C/C++代碼轉(zhuǎn)換工具提高MATLAB設(shè)計效率[J].電子設(shè)計技術(shù),2011(7):38.
[8]黃根嶺,張清淼,周利紅.MATLAB/Simulink在通信原理教學(xué)中的應(yīng)用[J].鄭州鐵路職業(yè)技術(shù)學(xué)院學(xué)報,2015(3):94-97.
[9]劉春輝.C++、java、matlab面象對象編程之比較[J].硅谷, 2010(6):75.
[10]蔣鵬.MATLAB編程的特點與優(yōu)化[J].數(shù)字技術(shù)與應(yīng)用, 2016(2):183.
[11]陳榮榮.C++與Matlab的基本語法比較[J].電腦編程技巧與維護,2011(14):32-34.
[12]李月潔,李蘭友,尤一鳴.內(nèi)存預(yù)分配管理[J].儀器儀表用戶,2006,13(5):104-105.
[13]李宛娜.堆棧溢出技術(shù)剖析[J].哈爾濱職業(yè)技術(shù)學(xué)院學(xué)報, 2008(1):115-116.
[14]宗志毅,王曉音,楊莘元.多率信號處理中的重采樣技術(shù)[J].電子信息對抗技術(shù),2003,18(3):37-41.
[15]李大勇.淺談軟件開發(fā)中代碼規(guī)范的問題[J].電子技術(shù)與軟件工程,2015(15):50.endprint