Как передать векторную переменную 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 '])'])
Другие вопросы по тегам