对于我的每次模拟运行,我使用matlabFunction
命令生成许多m文件。这些m文件用于生成人工潜在字段。 (标量)输入的数量可能因不同的运行而不同(由于我正在模拟的机器人的数量),但在运行期间保持不变。因为每个机器人都有自己的潜在场函数,所以我必须为每个机器人准备输入向量。我目前正在以下列方式为每个机器人i做这件事:
Tvec = [T(1:i-1,i).' T(i,1:i-1) T(i,i+1:end) T(i+1:end,i).'];
Xvec = reshape(xN_1',1,(J+K)*2);
if sum(leaders==i)
InputVector = num2cell([Tvec Xvec xd]);
else
InputVector = num2cell([Tvec Xvec]);
end
fun=gradfun{i};
[gradx,grady] = fun(InputVector{:});
上述代码的简短说明:我必须通过从矩阵T中提取一些值来准备传输矢量Tvec。此外,我需要位置矢量Xvec,并将它们传递给梯度函数。如果机器人是“领导者”,则还会添加目的地xd。 gradfun是函数句柄的单元格,指向我生成的潜在字段函数。 InputVector是一个带标量条目的单元格数组。
我的问题是这种方法由于num2cell命令而非常慢,这几乎占用了实际梯度计算的时间。有没有办法绕过使用num2cell命令?我愿意编辑潜在字段函数的函数输入,只要这可以从matlab脚本完成(即,这应该可以自动化而不是手动将逗号分隔的输入更改为基于矢量的输入)。
答案 0 :(得分:2)
我找到了解决问题的方法。对于那些感兴趣的人:可以使用matlabFunction
选项操作vars
生成的函数的输入变量,如下所示:
matlabFunction(symbolic_expression,'file',funname,'vars',{vector1,vector2,vector3});
其中vector1,vector2,vector3是符号向量。这样,生成的函数文件将接受向量输入。
答案 1 :(得分:1)
我认为您正在使用num2cell
并将其作为InputVector{:}
发送,仅为该函数生成输入参数。为什么不将[Tvec Xvec]
(或[Tvec Xvec xd]
)传递给函数,然后使用该向量元素作为参数。例如,在函数内部,您可以编写arg_1=vec(1)
,...,arg_n=vec(n)
。我相信你也知道你可以使用varargin
来区分不同的号码。输入参数并相应地采取行动。