簡體   English   中英

在 Matlab 函數中使用方程的變換?

[英]Use transformation of an equation within a Matlab function?

我正在嘗試編寫一個非常基本的平均似然估計器函數,該函數依賴於優化工具箱的fminsearch()函數。 我嘗試將函數句柄作為輸入傳遞並優化否定的總和。 函數的日志。 我的代碼是:

function [ params, max ] = routine( fun )
%UNTITLED3 Summary of this function goes here
%   Detailed explanation goes here

[filename,path] = uigetfile('*.'); #To grab the csv file location
name = strcat(path,filename);
data = csvread(name);

lh = @(x) sum(-log( fun(x) )); <-------- ERROR LINE

options = optimset('Display', 'off', 'MaxIter', 100000, 'TolX', 10^-20, 'TolFun', 10^-20);
[theta, max1] = fminsearch(lh, [0,1], options);

params = theta
max = max1

end

中間的那一行給了我這個錯誤:

Undefined function or variable 'data'.

Error in @(x)(1/(sqrt(2*pi)*x(2)))*exp((-(data-x(1)).^2)/(2*x(2)^2))

Error in @(x)sum(-log(fun(x)),data)

Error in fminsearch (line 200)
fv(:,1) = funfcn(x,varargin{:});

現在,在這段代碼之外,這工作得非常好,令人氣憤。

pan = @(x)sum(-log((1/(sqrt(2*pi)*x(2)))*exp((-(data-x(1)).^2)/(2*x(2)^2))));
options = optimset('Display', 'off', 'MaxIter', 100000, 'TolX', 10^-20, 'TolFun', 10^-20);
[theta, max1] = fminsearch(pan, [0,1], options);

出於某種原因,按照我在中間所做的方式轉換方程會使data 看不見。 我應該如何正確地將轉換應用到我的方程以使此代碼有效?

查看匿名函數的文檔 這是相關的部分

表達式中的變量

函數句柄不僅可以存儲表達式,還可以存儲表達式求值所需的變量。

例如,為需要系數abc的匿名函數創建函數句柄。

 a = 1.3; b = .2; c = 30; parabola = @(x) a*x.^2 + b*x + c;

由於abc在您創建parabola時可用,因此函數句柄包含這些值。 即使您清除了變量,這些值仍然存在於函數句柄中

 clear abc x = 1; y = parabola(x)

y = 31.5000

要為系數提供不同的值,您必須創建一個新的函數句柄

你的情況的值data您閱讀將無法使用fun ,因為函數句柄之前定義的data 相反,我們可以讓data成為fun的參數,然后我們一起避免這個問題。


調用代碼

myfun = @(x,data) (1/(sqrt(2*pi)*x(2)))*exp((-(data-x(1)).^2)/(2*x(2)^2));
[params,max] = routine(myfun);

例程.m (需要更改的位)

function [ params, max ] = routine( fun )
...
lh = @(x) sum(-log( fun(x,data) ));
...
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM