Как передать векторную переменную Matlab в функцию MuPAD?
Я хочу использовать stats::swGOFT
функция в MuPAD. У меня есть числовой вектор под названием r
, я использовал
feval(symengine, 'stats::swGOFT', r);
Ошибка была
Ошибка при использовании мупаденгина / февала (строка 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
?
1 ответ
MuPAD это не Matlab. Из текущей версии документации для stats::swGOFT
Похоже, что эта функция требует список, а не массив (что использует 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 '])'])