Matlab: структурные данные и многоуровневая индексация - PullRequest
1 голос
/ 18 марта 2012

У меня простая проблема со структурами.

Позволяет создать:

x(1).a(:, :) = magic(2);
x(2).a(:, :) = magic(2)*2;
x(3).a(:, :) = magic(2)*3;

как перечислить (1, 1) из всех x-es?

Я хотел сделать это так:

x(1, :).a(1,1)

но есть ошибка «Скалярный индекс необходим для многоуровневой индексации этого типа».

как подойти? Я знаю, что могу сделать это с помощью цикла, но это, вероятно, худшее решение :) Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 марта 2012

Вы также можете получить свои данные следующим образом:

B = cat(3,x.a);
out = reshape(B(1,1,:),1,[]);

Кстати, петли не являются злом. Иногда они даже быстрее, чем векторизованная индексация. Попробуйте оба способа, посмотрите, что подходит вам больше всего с точки зрения:

  • Скорость - используйте профилировщик для проверки
  • Четкость кода - зависит от контекста. Иногда векторизованный код выглядит лучше, иногда наоборот.
2 голосов
/ 18 марта 2012

Это не лучшая структура данных для использования, если вы хотите выполнить такой запрос именно потому, что такого рода индексация не может быть выполнена напрямую.

Однако, есть один подход, который работает:

cellfun(@(X) X(1,1), {x.a})

Синтаксис {x.a} преобразует x из «массива структуры» в массив ячеек. Затем мы используем cellfun, чтобы применить функцию в качестве карты для массива ячеек. Анонимная функция @(X) X(1,1) принимает один аргумент X и возвращает X(1,1).

...