2015-04-18 3 views
2

Я хочу использовать функцию stats::swGOFT в MuPAD. У меня есть числовой вектор, который называется r. Я использовалКак передать векторную переменную Matlab функции MuPAD?

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

Ошибка была

Error using mupadengine/feval (line 157)
MuPAD error: Error: Some data are of invalid type.

Так что я попытался более прямой путь, который работал:

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, кажется, что для этой функции требуется 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 '])']) 
+0

Я не понимаю этого: 'stats :: swGOFT (['rStr'])'. Похоже, что грамматика Мупада отличается от Matlab. В противном случае '['rStr']' inside 'stats :: swGOFT()' не имеет смысла в Matlab. Возможно, именно поэтому я не работал в Мупаде. Но так или иначе код работал. Благодаря! – fyang

+0

Почему существуют пробелы перед и после rStr в '['rStr']'? Я удалил пробелы, и этот '['rStr']' не работал. Таким образом, '['rStr']' эквивалентно списку чисел, например. '1, 2, 3, 4'. На самом деле сложно. – fyang

+0

@fyang: Это не 'статистика :: swGOFT (['rStr'])', но '['stats :: swGOFT ([' rStr '])']'. Это не сложно, это просто конкатенация строк. Вы не вызываете 'stats :: swGOFT' напрямую, а скорее говорите' feval' или 'evalin', чтобы вызвать его в правильном контексте. Вы должны указать им имя функции для вызова и указать любые аргументы. 'feval' называет' evalin' под капотом в этом случае, поэтому может быть немного более эффективным использовать его напрямую, но вы должны передать ему одну длинную строку. Немного [подробнее] (http://mathworks.com/help/symbolic/call-built-in-mupad-functions-from-the-matlab-command-window.html). – horchler