matlab編譯函數
A. 怎麼用matlab編譯下面的函數並畫圖,其中ξ為因變數,δ為自變數,h和h0已知
已知X123求Y的話,直接使用你的公式即可
代碼:
X1=[x11 x12 ... x1n];%行向量里都是n個數字,下同
X2=[x21 x22 ... x2n];
X3=[x31 x32 ... x3n];
Y=A0+A1*X1+A2*X2+A3*X3;%A0123為四個已知數字
這樣就求出了1行n列的行向量Y
至於你說的「預測」,我猜是A0123是待定系數吧。
也就是已知X123及Y的n組量,希望用三元一次函數進行擬合吧。
這樣的話,若用最小二乘法,思路是:
{下面我用sum(f(i),1,10)表示f(i)表達式從1加到10的值}
第一、設A0123為待定系數,並使用X123計算Y的估計值YY
YY=sum(A0+A1*X1i+A2*X2i+A3*X3i,1,n)
第二、計算真實的Y和估計的YY每個對應項之差的平方,再求總和S
S=sum((A0+A1*X1i+A2*X2i+A3*X3i-Yi)^2,1,n)
第三、目的是求使S最小的A0123,即為最小二乘解
這實際上是可微多維函數求極值的問題,用對各自變數求偏導並同時取零解決
此時針對上面的S等式分別對A0123求偏導
dS/dA0=sum(2*(A0+A1*X1i+A2*X2i+A3*X3i-Yi),1,n)
dS/dA1=sum(2*(A0+A1*X1i+A2*X2i+A3*X3i-Yi)*X1i,1,n)
dS/dA2=sum(2*(A0+A1*X1i+A2*X2i+A3*X3i-Yi)*X2i,1,n)
dS/dA3=sum(2*(A0+A1*X1i+A2*X2i+A3*X3i-Yi)*X3i,1,n)
上面4等式右邊提取A0123,再兩邊同除2得
(dS/dA0)/2=A0*n+A1*sum(X1i,1,n)+A2*sum(X2i,1,n)+A3*sum(X3i,1,n)-sum(Y,1,n)
(dS/dA1)/2=A0*sum(X1i,1,n)+A1*sum(X1i*X1i,1,n)+A2*sum(X2i*X1i,1,n)+A3*sum(X3i*X1i,1,n)-sum(Y*X1i,1,n)
(dS/dA2)/2=A0*sum(X2i,1,n)+A1*sum(X1i*X2i,1,n)+A2*sum(X2i*X2i,1,n)+A3*sum(X3i*X2i,1,n)-sum(Y*X2i,1,n)
(dS/dA3)/2=A0*sum(X3i,1,n)+A1*sum(X1i*X3i,1,n)+A2*sum(X2i*X3i,1,n)+A3*sum(X3i*X3i,1,n)-sum(Y*X3i,1,n)
令上4等式左邊為0,注意到右邊都是「A0*已知常數+A1*已知常數+A2*已知常數+A3*已知常數-已知常數」的形式
因此得到一個四元一次非齊次方程組,用高等數學中線性方程組的求解方法求解(或者甚至用初中的代入法求解方程組)即可
這樣就得到了最佳的A0123四個數字,這四個參數使得擬合的Y=A0+A1*X1+A2*X2+A3*X3函數,與給定的X123和Y數據在最小二乘意義下差值最小,即最佳擬合
B. matlab編一個函數
(1)
function y=TestEs(x)
y=0.5*exp(x/3)-x.^2.*sin(x);
(2)
x=3;
y=TestEs(x)
x=[2,3.5];
y=TestEs(x)
C. 用matlab如何編寫一個函數文件,實現 n!
用matlab如何編寫一個函數文件,實現n!的方法。
如下參考:
1.首先在計算機上打開matlab軟體,如下圖所示。
D. 如何用matlab編寫函數程序
你給出的是C語言程序吧,matlab也是一樣的,只不過數組的編號是從1開始的,而且語法有些不同。
t(1)=0
s(1)=0
B(1)=0
for
n=2:160
x(n)=z600028;
t(n)=x(n).*2./13+t(n-1)*11/13
s(n)=x(n)*2/27+s(n-1)*25/27
A(n)=t(n)-s(n)
B(n)=A(n)*2/10+B(n-1)*8/10
end
增加:
此時你已經得到了A(n)與B(n),再加入下列語句,就可以畫出他們的圖像。
figure;
plot(A);
figure;
plot(B);
E. matlab這幾個函數如何編寫。求源代碼。全部解決再加100分
1、在命令窗口中輸入:type 函數名(例如type rgb2gray等),就會在命令窗口出現該函數的相關說明及源代碼;
2、在命令窗口中輸入:open 函數名(例如open rgb2gray等),就會打開該函數的m文件;
3、在命令窗口中輸入:edit函數名(例如edit rgb2gray等),同樣會打開該函數的m文件;
4、還有一種方法就是故意將原函數的參數類型或者個數寫錯,就會出現出錯提示,點擊提示出錯處,也可以打開該函數的m文件;
很多大型的函數都能獲得源代碼,但是MATLAB裡面有一些built-in函數是看不到源代碼的,sort就是其中之一。這些函數是預編譯好的,運行效率非常好,比如像find、min、max等頻繁用到的一些函數還有很多矩陣運算函數都是built-in函數。
自帶函數,用type+函數名。比如,type dwt2可以顯示dwt2函數的代碼
但是,好像沒有qpsk這個函數.
F. matlab怎樣編寫函數並調用函數
1'編寫一個m文件,如:
function f=add(a,b)
f=a+b;
end
保存為add.m,比如保存在桌面
2'將桌面添加到matlab搜索路徑中
G. matlab中用什麼實現公式編譯
由於時間倉促,簡單地學習了如何將.m文件打包為.exe文件
首先介紹一下MATLAB編譯器
MATLAB編譯器
功能
1、產生C源碼,並進而生成MEX文件。這種MEX文件的優點是:一,當程序變數為實數,或向量化程度較低,或含有循環結構時,採用該法可提高運行速度;二,與ASCII碼的M文件不同,MEX文件採用二進制代碼生成,能更好地隱藏文件演算法,使之免遭非法修改。
2、產生C或C++源碼,以便與其他C/C++模塊結合行成獨立的外部應用程序。運行所產生的應用程序,無需MATLAB環境的支持,但是往往需要MATLAB提供的C/C++數學庫;如果調用了MATLAB繪圖指令,則還需要MATLAB提供的C/C++圖形庫
3、產生C MEX的S函數,與Simulink配合使用,以提高S-函數的運行速度
4、產生C 共享庫(動態鏈接庫)或C++靜態庫,他們的使用無需MATLAB環境的支撐,但是需要MATLAB的數學庫
局限性
1、無法編譯腳本文件
2、不支持用戶自定義對象
3、不支持eval,input,inline等函數
4、不支持的MATLAB的Java介面
腳本文件改寫為函數文件
M腳本文件不能直接被MATLAB編譯器所編譯,解決方案:先把腳本M文件改寫成函數M文件,然後再對這函數文件進行編譯。
編譯器的配置:
在MATLAB命令窗中運行mex –setup
H. MATLAB 編譯
M-file里設置端點debug-set/enable breakpoint
然後在主界面的Workspace里有所有變數的值~~
I. 請教關於利用Matlab中「mex」命令編譯C程序的問題
1.准備好C語言程序,清楚C語言的入口函數
2.編寫mexfunction函數。mexfunction函數為C語言與MATLAB語言的介面函數。調用實例在mylinedetect.c文件中.在MATLAB中調用mex指令編譯相關文件,將C語言編譯為MEX文件。
3.編譯完成後,生成mylinedetect.mexw32或mylinedetect.mexw64文件,此文件即mex文件,用於MATLAB與C語言介面函數.
4.編譯完成之後,編寫MATLAB函數,調用MEX文件。以MEX文件的形式調用編譯完成的C語言函數[o1,o2]=mylinedetect(double(X).');......
5.輸出結果,上述linedetect函數完成圖像中直線檢測功能,帶入MATLAB中調用後形成結果。
J. MATLAB程序如何編譯產生DLL
把一個簡單的m代碼編譯成C++介面的DLL,然後在C++程序中調用。為了簡單起見,這里的C++程序是一個Win32 Console程序,而不是Windows圖形界面的程序,不過不妨礙我們的討論。
下面是這個例子用到的m代碼。它定義了一個名為myadd2的函數
function [y,z] = myadd2(a, b)
% mmy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
end
復制代碼
首先把這個函數編譯成C++介面的DLL。為此,我們需要先設置MATLAB編譯器。具體做法是在MATLAB命令行執行「mbuild -setup」。然後用下面這行命令把myadd2函數編譯成一個C++介面的DLL:
mcc -W cpplib:libmyadd2 -T link:lib myadd2
復制代碼
結果,我們將會得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在內的一些文件。接下來我們只需要這四個文件。
然後在VS2005中創建一個Win32 Console的VC++工程,我在測試時取名為testmyadd2_r2007b。把以上四個文件拷貝到VC++工程的源代碼所在目錄。
接下來設置VC++,讓它能找到MATLAB介面函數的定義及連接庫函數。可以有兩種設置方式:一種是改VS2005中關於VC++的設置,這樣的好處是每個新的工程都能自動獲得這個設定;而另一種是只改當前工程的設置,也就是設置只對該工程有效。這里用後一種方式。
在VS2005中打開工程testmyadd2_r2007b,選擇菜單「Project-->;Properties,在出來的對話框上,把MATLAB提供的include路徑加到VC++的頭文件搜索路徑。
然後把相應的lib所在目錄加到linker的額外搜索路徑上
接下來,告訴VC++,我們的這個程序需要連接到另外兩個額外的庫函數:libmyadd2.lib和mclmcrrt.lib。中間用空格隔開
最後則是程序代碼。這個程序只有一個main函數,其完整代碼附在下面給大家參考。
#include "stdafx.h"
#include <iostream>
#include "mclmcr.h"
#include "mclcppclass.h"
#include "libmyadd2.h"
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "Hello world!" << std::endl;
/* Initialize the MCR */
if( !mclInitializeApplication(NULL,0) )
{
std::cout << "Could not initialize the application!" << std::endl;
return -1;
}
// initialize lib
if( !libmyadd2Initialize())
{
std::cout << "Could not initialize libmyadd2!" << std::endl;
return -1;
}
try
{
// declare and initialize a
mwArray a(2, 2, mxDOUBLE_CLASS);
double *aData;
aData = new double[4];
復制代碼
本帖隱藏的內容
int i;
for( i=0; i<4; ++i)
{
aData = 1.0*i;
}
// print output
std::cout << "a = " << std::endl;
std::cout << aData[0] << ",\t" << aData[1] << std::endl;
std::cout << aData[2] << ",\t" << aData[3] << std::endl;
a.SetData(aData, 4);
// declare and initialize b
mwArray b(2, 2, mxDOUBLE_CLASS);
b(1,1) = 11.;
b(1,2) = 12.;
b(2,1) = 21.;
b(2,2) = 22.;
mwArray y(2, 2, mxDOUBLE_CLASS);
mwArray z(2, 2, mxDOUBLE_CLASS);
// call the function
myadd2(2, y, z, a, b);
// data from mwArray to C++ objects
// allocate outputs
double *yData, *zData;
yData = new double[4];
復制代碼
if( yData == NULL )
{
std::cout << "Failed to allocate memory for yData!" << std::endl;
return -1;
}
zData = new double[4];
if( zData == NULL )
{
std::cout << "Failed to allocate memory for zData!" << std::endl;
return -1;
}
// data from mwArray to C++
y.GetData(yData, 4);
z.GetData(zData, 4);
// print output
std::cout << "y = " << std::endl;
std::cout << yData[0] << ",\t" << yData[1] << std::endl;
std::cout << yData[2] << ",\t" << yData[3] << std::endl;
std::cout << "z = " << std::endl;
std::cout << zData[0] << ",\t" << zData[1] << std::endl;
std::cout << zData[2] << ",\t" << zData[3] << std::endl;
// deallocate memory
delete [] aData;
delete [] zData;
delete [] yData;
}
catch( const mwException& e)
{
std::cerr << e.what() << std::endl;
}
// terminate the lib
libmyadd2Terminate();
// terminate MCR
mclTerminateApplication();
return 0;
}