Кажущийся конфликт между arrayfun и string () - PullRequest
1 голос
/ 23 июня 2019

Я надеюсь, что смогу удобно убедиться, что поле структурного массива содержит только строки (а не символьные массивы). Например,

S(1).f='abc'; S(2).f='asdfa'; S(3).f="aegwer";

Если один делает

setfield(S(1),'f',string(S(1).f))

S(1).f будет успешно преобразовано в "abc", как и ожидалось.

Однако,

arrayfun(@(s)setfield(s,'f',string(s.f)),S)

не только не в состоянии установить все значения полей в 'f' в строки, но фактически преобразовать все значения полей в 'f' в символьные массивы.

Почему arrayfun превращает string() в char()? Или это что-то еще?

MATLAB версия, которую я использую: R2018a

1 Ответ

3 голосов
/ 24 июня 2019

Проблема здесь в том, что setfield и arrayfun не изменяют исходный объект S (т. Е. Нет поведения, похожего на ссылку для структур).Они создают новый измененный объект и возвращают его.Вам нужно будет перезаписать S этим возвращаемым значением для его обновления:

S = arrayfun(@(s) setfield(s, 'f', string(s.f)), S);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...