zoukankan      html  css  js  c++  java
  • MATLAB总结二

    1、如何将一个多项式中的系数按照幂次提取出来?

    sym2poly(ans) %ans为一个多项式。

    2、在写第二份模式识别的大作业时遇到如下困难:

    每个样本贡献给总概率的是一个关于x的表达式,我将所有的样本的关于x的表达式都给加起来,就得到关于x的一个总的表达式,设为y。

    在函数运行过程中,你并不知道这个y表示的到底是个什么函数。

    但是,我需要把x赋上一系列的值,从而得到关于函数值y,打出点来。

      首先尝试了函数句柄的方法,我认为这个应该可以行的通,于是查询了它的用法:

     1 %函数句柄是MATLAB中的一类特殊的数据结构。作用是将一个函数封装成一个变量,使其能够像其他变量一样在程序的不同部分传递。
     2 
     3 % 函数句柄的创建% 方式1 : 直接加@
     4 % 语法:@函数名fun1 = @sin;
     5 
     6 % 方式2 : str2func函数
     7 % 语法:str2fun('函数名')
     8 fun2 = str2func('cos');
     9 
    10 % 方式3 : 匿名函数
    11 % 语法:@(参数列表)单行表达式
    12 fun3 = @(x, y)x.^2 + y.^213 
    14 % 函数句柄的调用fun1(pi);fun3(1,2);

      

    1 >>sqr = @(x) x.^2
    2 >>a = sqr([1, 2, 3])
    3 a =
    4      1     4     1 %函数句柄作为另一个函数的参数传入的用法 2 
     3 %新建M文件f1.m
     4 
     5 function y=f1(X)
     6 
     7 x1=X(1);x2=X(2);
     8 y=x1^2+x1*x2;
     9 
    10 %新建M文件ftest.m
    11 
    12 function Y=ftest(f,X)%求一个二维函数在指定点的梯度值,f即为这个二维函数,优点:在f1中定义其他任何函数,而ftest不需要改变
    13 
    14 syms x1 x2;
    15 F=f([x1,x2]);%根据f1.m的用法传入参数
    16 v=[x1,x2];
    17 grad=jacobian(F,v);
    18 Y=subs(grad,v,X);
    19 
    20 %在MATLAB命令窗口输入Y=ftest(@f1,[2,1]),得到结果:
    21 
    22 Y =
    23 
    24     5    2

    但是遇到如下问题:方式3中必须使单行已知表达式,无法用一个变量代替这个表达式,我进行了以下实验。

    1 >> syms x y
    2 >> z = x.^2 + y.^2;
    3 >> fun3 = @(x, y)z;
    4 >> fun3(1,2)
    5  
    6 ans =
    7  
    8 x^2 + y^2%ans的值并没有赋进去

     如何用函数句柄的方式达到自己想要的目的,以及函数句柄究竟好用在哪里,需要进一步实验。

      在换了无数种提问方式之后,终于找到了问题的答案——内联函数

     1 >> syms x y
     2 >> z = x.^2 + y.^2;
     3 
     4 >> inline(z)
     5 
     6 ans =
     7 
     8      内联函数:
     9      ans(x,y) = x.^2+y.^2
    10 
    11 >> z(1,2)
    12 错误使用 sub2ind (line 55)
    13 下标超出范围。
    14 
    15 出错 sym/subsref (line 800)
    16                 R_tilde = sub2ind(size(L), Idx.subs{:});
    17  
    18 >> ans(1,2)
    19 
    20 ans =
    21 
    22      5
    1 f=inline('x+y','x','y');
    2 
    3 f(2,3)
    4 
    5 ans =  5

    语法格式为:

    1  变量名=inline(表达式);
     
    2  变量名=inline('函数表达式', '变量名1','变量名2', ... ,'变量名n');(推荐)

    inline函数可以对某个变量调用数组

     1 >> syms x a b
     2 >> z = 2*cos(a*x)-b;
     3 >> f = inline(z)
     4 
     5 f =
     6 
     7      内联函数:
     8      f(a,b,x) = -b+cos(a.*x).*2.0
     9 
    10 >> f = inline(z,'x','a','b')%在inline函数中确定了参数的先后顺序,在下面对应地赋值
    11 
    12 f =
    13 
    14      内联函数:
    15      f(x,a,b) = -b+cos(a.*x).*2.0 
    16 
    17 >> g = f([pi/3 pi/3.5], 4, 1)
    18 
    19 g =
    20 
    21    -2.0000   -2.8019

      除此之外,学习到了feval函数的用法,虽然不能解决我目前碰到的这个问题,但是可以方便我以后的编程。

      feval函数的最通常的应用是以下形式:
      feval('functionname',parameter),举个简单的例子:
      比如要计算sin(2),当然可以直接用命令y=sin(2);利用feval,还可以这样来做:
      y=feval('sin',2);另外这里的函数名字还可以是一个函数句柄,即h=@sin;
      y=feval(h,2);或者直接写成y=feval_r(@sin,2);

     1 >> feval('sin', 2)
     2 
     3 ans =
     4 
     5     0.9093
     6 
     7 >> feval('sin', [1,2])
     8 
     9 ans =
    10 
    11     0.8415    0.9093
    12 
    13 >> feval(@sin, [1,2])
    14 
    15 ans =
    16 
    17     0.8415    0.9093

      个人觉得,这个函数的方便之处在于,你可以给函数的第二个参数赋进去一个向量(数组),这样一次就可以得到不同参数的不同结果。

      

  • 相关阅读:
    mysql清空表中内容
    Proteus元件查找
    HDG12864F1 proteus仿真取模【PCtoLCD完美版】
    OLED取模(汉字加图片)
    Failed to connect to ESP8266: Timed out waiting for packet header
    AD常用快捷键
    Authentication method 'caching_sha2_password' not supported by any of the available plugins.
    spark阶段学习总结(三)
    spark阶段学习总结(一)
    spark阶段学习总结(二)
  • 原文地址:https://www.cnblogs.com/dadidelearning/p/9777515.html
Copyright © 2011-2022 走看看