如何将常量传递给循环

时间:2015-07-17 10:04:59

标签: matlab

我正在为通信频道实现ML接收器。 为此,我需要在x(16QAM)范围内找到x = 0 to 15以下函数的最小值

f = abs( rx(n) - (h'*h)*x )^2 ; 

我必须在循环(n=1:100)中迭代它。我发现我可以通过matlab函数x = fminbnd(fun,x1,x2)来实现这一点,我可以将函数放在一个单独的.m文件中:

function f = myfun(x)  
f = abs( rx(n) - (h'*h)*x )^2   

并从

中找到x的最小值
x = fminbnd(@myfun,x1,x2);

我的问题是,因为函数rx(n)的常量正在循环变化,如何将它发送到循环中的函数myfun(x)

2 个答案:

答案 0 :(得分:0)

您可以使用匿名函数在单独的文件中调用函数来执行此操作:

function mainfcnmin
    h = [1;1];
    rx = 1:3;

    for n = 1:length(rx)
        x = fminbnd(@(x)myfun(x,rx(n),h),0,15)
    end
end

function f = myfun(x,rx,h)
    f = abs(rx-(h'*h)*x)^2 ;
end

或者在一个文件中通过直接在匿名函数中定义函数,如下所示:

h = [1;1];
rx = 1:3;

for n = 1:length(rx)
    x = fminbnd(@(x)(abs(rx(n)-(h'*h)*x)^2),0,15)
end

答案 1 :(得分:0)

您需要使用rx(n)作为第二个参数创建一个函数,然后将其转换为循环内的单个参数匿名函数。

以下是MATLAB文档中的一个示例(用于'fminsearch'函数):

  

如果参数化了fun,则可以使用匿名函数进行捕获   与问题有关的参数。例如,假设你想要   最小化由以下定义的myfun的目标函数   功能文件:

function f = myfun(x,a)
    f = x(1)^2 + a*x(2)^2;`
  

请注意,myfun有一个额外的参数a,因此您无法将其直接传递给> fminsearch。优化a的特定值,例如a = 1.5。

     
      
  1. 将值分配给a      
        

    a = 1.5; % define parameter first

      
  2.   
  3. 呼叫   fminsearch使用单参数匿名函数捕获它   a的值并用两个参数调用myfun:

    x = fminsearch(@(x) myfun(x,a),[0,1])
    
  4.   

希望有所帮助(抱歉文本格式不好)。