线性变换函数句柄

时间:2015-06-01 14:22:15

标签: matlab anonymous-function cell-array function-handle

假设我将单元格数组P中的legendre多项式作为函数句柄。现在我使用线性变换x = 2/3 * t-1。现在我想得到一个具有转换函数句柄的单元格数组Q. 所以P = [1,@(x)x,1/2 *(3 * x ^ 2-1),......]到Q = [1,@(t)2/3 * t-1,... ]

谢谢!

2 个答案:

答案 0 :(得分:0)

假设你有符号工具箱,你可以这样做:

  1. 将您的匿名函数的单元格数组转换为字符串的单元格数组
  2. 使用subs更改变量。这会产生symbolic objects作为输出。
  3. 使用matlabFunction从符号对象转换为匿名函数:
  4. 代码:

    P = {@(x) 1, @(x) x, @(x) 1/2*(3*x^2-1)};        %// data 
    f = cellfun(@func2str, P, 'uniformoutput', 0);   %// step 1
    Q = arrayfun(@(k) matlabFunction(subs(f{k}(5:end), 'x', '2/3*t-1')), 1:numel(P),...
        'uniformoutput', 0);                         %// steps 2 and 3.
        %// Note that the "(5:end)" part is used for removing the initial "@(x)"
        %// from the string obtained from the function
    

    此示例中的结果:

    Q{1} =
        @()1.0
    Q{2} =
        @(t)t.*(2.0./3.0)-1.0
    Q{3} =
        @(t)(t.*(2.0./3.0)-1.0).^2.*(3.0./2.0)-1.0./2.0
    

答案 1 :(得分:0)

它也可以在基本的MATLAB中完成:你只需要用变换函数组合多项式的匿名函数。在编写解决方案之前,我想指出您的发布不一致:您谈论函数句柄的单元格数组,但您使用矩阵表示法来定义。

代码:

%// The original polynomials
P = {@(x) 1,  @(x) x,  @(x) 1/2*(3*x^2-1)};

%// The transformation function
x = @(t)2/3*t-1;

%// The composition
Q = cellfun(@(f) @(t)f(x(t)), P, 'UniformOutput', false );

结果将是一个函数的单元格数组,可以完成这些工作:

x == 1  --> t == 3
P{2}(1) --> 1
Q{2}(3) --> 1