Более простая «карта» для структур в октаве - PullRequest
0 голосов
/ 05 июня 2018

У меня есть следующий массив структур в октаве:

p=[struct('a',[1,2],'b',[3,4,5]),struct('a',[7,8,9],'b',[10,11])]

Теперь я хочу применить функцию к ним равномерно:

arrayfun(@(x) x.b(1:2),p)

Но поскольку октава не делает вывод, что выражение b(1:2) дает одинаковые результаты, я получаю:

error: arrayfun: all values must be scalars when UniformOutput = true

Теперь я нашел следующий обходной путь:

reshape(cell2mat(arrayfun(@(x) x.b(1:2),p,"UniformOutput",false)),2,2)'

Есть ли более простой способ сделать это?

1 Ответ

0 голосов
/ 10 июня 2018

Документация:

Если для параметра val после дополнительного строкового входного аргумента "UniformOutput" задано значение true (по умолчанию), то именованная функция func должна вернуть одинэлемент, который затем будет объединен в возвращаемое значение и имеет матрицу типа.

Унифицированный вывод означает, что размеры ввода и вывода одинаковы, но не все возвращаемые значения имеют одинаковый размер.

Вы можете избежать изменения формы, прократив цитату в разные позиции:

cell2mat(arrayfun(@(x) x.b(1:2)',p,"UniformOutput",false))
cell2mat(arrayfun(@(x) x.b(1:2),p,"UniformOutput",false)')

, но шаг преобразования ячейки останется.(Также будьте осторожны с кавычками и комплексными числами.)

...