【问题标题】:Matlab - Issue with evaluating anonymous function using arrayfunMatlab - 使用 arrayfun 评估匿名函数的问题
【发布时间】:2015-01-16 03:55:09
【问题描述】:

我遇到以下 Matlab 错误:

??? Input argument "Va4" is undefined.

Error in ==>
sym.matlabFunction>makeFhandle/@(Va1,Va4,Vm1,Vm4)reshape([cos(conj(Va1)-conj(Va4)).*conj(Vm1).*conj(Vm4).*(6.25e2./7.2e1)+Vm1.*Vm4.*cos(Va1-Va4).*(6.25e2./7.2e1),sin(conj(Va1)-conj(Va4)).*conj(Vm1).*conj(Vm4).*(6.25e2./7.2e1)+Vm1.*Vm4.*sin(Va1-Va4).*(6.25e2./7.2e1),Vm4.*sin(Va1-Va4).*(6.25e2./7.2e1)+sin(conj(Va1)-conj(Va4)).*conj(Vm4).*(6.25e2./7.2e1),Vm1.*(6.25e2./3.6e1)+conj(Vm1).*(6.25e2./3.6e1)-Vm4.*cos(Va1-Va4).*(6.25e2./7.2e1)-cos(conj(Va1)-conj(Va4)).*conj(Vm4).*(6.25e2./7.2e1)],[2,2])

我正在尝试评估一个匿名函数,一个 2x2 矩阵,如下所示

J = @(Va1,Va4,Vm1,Vm4) reshape( ...
    [cos(conj(Va1)-conj(Va4)).*conj(Vm1).*conj(Vm4).*(6.25e2./7.2e1)+Vm1.*Vm4.*cos(Va1-Va4).*(6.25e2./7.2e1),...
    sin(conj(Va1)-conj(Va4)).*conj(Vm1).*conj(Vm4).*(6.25e2./7.2e1)+Vm1.*Vm4.*sin(Va1-Va4).*(6.25e2./7.2e1),...
    Vm4.*sin(Va1-Va4).*(6.25e2./7.2e1)+sin(conj(Va1)-conj(Va4)).*conj(Vm4).*(6.25e2./7.2e1),...
    Vm1.*(6.25e2./3.6e1)+conj(Vm1).*(6.25e2./3.6e1)-Vm4.*cos(Va1-Va4).*(6.25e2./7.2e1)-cos(conj(Va1)-conj(Va4)).*conj(Vm4).*(6.25e2./7.2e1)],...
    [2,2]);

arrayfun(J, [0,0,1,1] ,  'UniformOutput', false)

知道出了什么问题吗?


编辑:我应该提到函数 J 是从其他函数定义的,因此我无法将输入作为单独的参数提供。我试图将输入作为单元格传递为: arrayfun(J, {0,0,1,1} , 'UniformOutput', false);但我遇到了以下错误

??? Undefined function or method 'conj' for input arguments of type 'cell'.

编辑 #2:由下面的 Nemesis 解决,我们需要使用 A{:} 将单元格输入 A = {0,0,1,1} 传递到 arrayfun。

【问题讨论】:

    标签: matlab anonymous-function


    【解决方案1】:

    查看arrayfun.的文档

    [B1,...,Bm] = arrayfun(func,A1,...,An,Name,Value)
    

    每个输入参数都是一个参数。由于您将四个输入参数作为数组传递

    [0,0,1,1]
    

    这仅被视为一个参数。只需将您对匿名函数的调用重写为

    arrayfun(J, 0, 0, 1, 1,  'UniformOutput', false)
    

    解决了这个问题。您现在可以使用例如使您的代码更加并行

    arrayfun(J, [0 1 1],[0 0 1],[1 0 1],[1 1 1] ,  'UniformOutput', false)
    
    ans = 
    
        [2x2 double]    [2x2 double]    [2x2 double]
    

    它将在所有[0,0,1,1][1,0,0,1][1,1,1,1] 上使用函数J

    【讨论】:

    • 谢谢。我应该提到这个过程需要动态完成,这意味着 J 是由其他一些函数定义的,所以我不能手动拆分输入参数。因此,我尝试使用: arrayfun(J, {0,0,1,1} , 'UniformOutput', false) 但我遇到了错误??? 'cell' 类型的输入参数的未定义函数或方法 'conj'。
    • 在这种情况下,将您的数据分配给像A = {0,0,1,1} 这样的单元格,然后通过arrayfun(J, A{:} , 'UniformOutput', false) 将其传递给arrayfun
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2012-10-25
    • 1970-01-01
    • 2011-07-18
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多