【问题标题】:How to pass a Matlab vector variable to a MuPAD function?如何将 Matlab 向量变量传递给 MuPAD 函数?
【发布时间】:2015-04-18 19:43:27
【问题描述】:

我想在 MuPAD 中使用stats::swGOFT 函数。我有一个名为r 的数值向量。我用过

feval(symengine, 'stats::swGOFT', r); 

错误是

使用 mupadengine/feval 时出错(第 157 行)
MuPAD 错误:错误:某些数据的类型无效。

所以我尝试了一种更直接的方法,效果很好:

feval(symengine, 'stats::swGOFT', 1,2,3,4);

但这不起作用:

feval(symengine, 'stats::swGOFT', [1,2,3,4]);

我的变量 r 是一个 1146×1 双向量。显然我不能手动输入所有的数字。那么,如何将向量变量r传递给MuPAD函数stats::swGOFT呢?

【问题讨论】:

    标签: matlab statistics symbolic-math mupad


    【解决方案1】:

    MuPAD 不是 Matlab。从stats::swGOFT 的当前版本文档来看,这个函数似乎需要list,而不是array(Matlab 使用的)。许多 MuPAD 函数会自动将 coerce 输入到所需的格式,但在这种情况下似乎不会发生这种情况。如果您想使用数值从 Matlab 调用此函数,您有多种选择 - 这是一个适用于浮点和符号数值的简单方法:

    r = randn(1146,1);
    rStr = char(sym(r(:).'));
    feval(symengine, 'stats::swGOFT', rStr(9:end-2))
    

    对于使用sprintf的大型浮点值数据集,这应该更快地执行字符串转换:

    r = randn(1146,1);
    rStr = ['[' sprintf('%.17g', r(1)) sprintf(',%.17g', r(2:end)) ']'];
    feval(symengine, 'stats::swGOFT', rStr)
    

    既然是自己转换成字符串,不如把上面的转换成直接使用evalin

    r = randn(1146,1);
    rStr = [ sprintf('%.17g', r(1)) sprintf(',%.17g', r(2:end)) ];
    evalin(symengine, ['stats::swGOFT([' rStr '])'])
    

    【讨论】:

    • 我不明白这个:stats::swGOFT([' rStr '])。看来 Mupad 语法与 Matlab 不同。否则,stats::swGOFT() 中的 [' rStr '] 在 Matlab 中没有意义。也许这就是我没有让它在 Mupad 中工作的原因。但无论如何,代码都有效。谢谢!
    • 为什么[' rStr ']的rStr前后有空格?我删除了空格,这个['rStr'] 没有用。所以,[' rStr '] 相当于一个数字列表,例如1, 2, 3, 4。确实很棘手。
    • @fyang:不是stats::swGOFT([' rStr ']),而是['stats::swGOFT([' rStr '])']。这并不棘手,它只是字符串连接。您不是直接调用stats::swGOFT,而是告诉fevalevalin 在正确的上下文中调用它。您必须告诉他们要调用的函数的名称并指定任何参数。在这种情况下,feval 在后台调用evalin,因此直接使用它可能会更有效,但您必须传递一个长字符串。有点more here.
    • 如果有帮助,可以在里面加逗号,进一步区分字符数组的元素:['stats::swGOFT([', rStr, '])']。这等效于显式使用strcatstrcat('stats::swGOFT([', rStr, '])')。如果您仍然感到困惑,请尝试打印出 rStr['stats::swGOFT([' rStr '])'] 以获得小矢量。这里有更多关于 Matlab 中 working with strings 的内容。
    • 谢谢!在你输入逗号后,我明白你的意思了。这是 Matlab 语法。只是为了连接 3 个字符串。
    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    相关资源
    最近更新 更多