Векторизация многоуровневой индексации структур в MATLAB - PullRequest
11 голосов
/ 24 октября 2011

Скажем, у меня в MATLAB есть следующее:

a(1).b.c = 4;
a(2).b.c = 5;
a(3).b.c = 7;
....

Я хотел бы собрать значения [4 5 7 ...] в один массив, без зацикливания и в векторизации.

Iпытались:

>> a(:).b.c 
# Error: Scalar index required for this type of multi-level indexing.

и

>> a.b.c
# Error: Dot name reference on non-scalar structure.

, но они не работали.Лучшее, что я мог придумать, было:

arrayfun(@(x) x.b.c, a);

, но, насколько я понимаю, arrayfun это не векторизация , или это так?

Ответы [ 3 ]

2 голосов
/ 27 октября 2011

Вы можете сделать это в две строки:

>> s = [a.b];
>> y = [s.c]
y =
     4     5     7

Еще один возможный однострочный (менее читаемый!):

>> y = squeeze(cell2mat( struct2cell([a.b]) ))
y =
     4
     5
     7
2 голосов
/ 24 октября 2011

Ваш звонок на arrayfun кажется мне достаточно идиоматичным в Matlab. Я не думаю, что это векторизация, но она хорошо оптимизирована и, возможно, самый быстрый способ. Вы также должны попытаться выполнить сравнительный анализ с помощью цикла, чтобы увидеть, хорошо ли работает JIT-компилятор. Это сложно узнать без тестирования.

1 голос
/ 25 октября 2011

a.b возвращает несколько выходов, поэтому вы не можете ожидать вызова функции на нем. Лучшая однострочность, которую я могу придумать без использования arrayfun:

y = subsref([a.b], substruct('.', c));

Обратите внимание, что a.b.c фактически совпадает с:

y = subsref(a.b, substruct('.', c))

Именно поэтому он не должен работать для нескалярных a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...