将向量传递给不带num2cell的matlabfunction

将向量传递给不带num2cell的matlabfunction,matlab,symbolic-math,Matlab,Symbolic Math,对于每次模拟运行,我都使用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

对于每次模拟运行,我都使用
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脚本完成(即,这应该可以自动化,而不是手动将逗号分隔的输入更改为基于向量的输入)。

我认为您正在使用
num2cell
并将其作为
InputVector{:}发送
仅用于生成函数的输入参数。为什么不将
[Tvec Xvec]
(或
[Tvec Xvec xd]
)传递给函数,然后将该向量元素用作参数。例如,在函数内部,您可以编写,
arg\u 1=vec(1)
,…,
arg\u n=vec(n)
。我相信您也知道,您可以使用
varargin
来区分不同数量的输入参数,并采取相应的措施。

我找到了解决此问题的方法。对于感兴趣的人:可以使用
vars
选项操作
matlabFunction
生成的函数的输入变量,如下所示:

matlabFunction(symbolic_expression,'file',funname,'vars',{vector1,vector2,vector3});

其中vector1、vector2、vector3是符号向量。这样,生成的函数文件将接受向量输入。

如果我理解正确,输入向量中的单个单元格将只有1个元素,对吗?这是正确的。Tvec是机器人i到其他每个机器人的传输速率向量,Xvec和xd是(x,y)位置向量,Xvec有一系列(x,y)对,每个机器人一对。不幸的是,这对我来说不是一个可行的选择,因为函数文件本身经常被覆盖(例如,每次更改机器人的数量时,它们都会重新生成)。但是,我找到了一种方法来处理生成的函数所接受的输入。您的回答让我想到了这个解决方案,所以谢谢您!