Matlab - 使用arrayfun评估匿名函数的问题

时间:2014-11-18 20:12:53

标签: matlab anonymous-function

我遇到以下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。

1 个答案:

答案 0 :(得分: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]

将在所有J[0,0,1,1][1,0,0,1]上使用[1,1,1,1]功能。