Быстрый способ объединения сложных данных с использованием vertcat с пользовательскими строками - PullRequest
1 голос
/ 05 апреля 2019

Мне нужно объединить несколько больших матриц, но определенным образом - например, объединить только 1 строку из X матриц. Существует хорошее решение для хранения данных в структуре, поэтому нет необходимости готовить длинный список вещей, которые необходимо объединить.

Например, у нас будет такая структура:

struct(1).huge = [1 2 3 4; 1 2 3 4];
struct(2).huge = [1 2 3 4; 1 2 3 4];
struct(3).huge = [1 2 3 4; 1 2 3 4];

Тогда мы можем объединить их с:

concatVar.concat = vertcat(struct.huge);

Вместо, например:

concatVar.concat = vertcat(struct(1), struct(2),(...),struct(100));

Но что, если мне нужно объединить только определенные строки из разных полей в структуре, например, только 1 строку:

concatVar.concat = vertcat(struct.huge(1,:));

Тогда этот метод не будет работать, с ошибкой:

"Ожидается один вывод из выражения индексации с фигурными скобками или точками, но были результаты X".

Можно ли сделать что-то подобное быстрым и надежным способом с использованием vertcat или horzcat?

Спасибо за любой совет! БМ

1 Ответ

3 голосов
/ 05 апреля 2019

В этом случае трудно избежать цикла.Вы можете преобразовать поле структуры в ячейку и затем использовать cellfun, что по сути является циклом.

Пусть ваша структура будет определена следующим образом.Обратите внимание, что не рекомендуется использовать имена функций или зарезервированные слова, такие как struct, в качестве имен переменных.

s(1).huge = [1 2 3 4; 1 2 3 4];
s(2).huge = [1 2 3 4; 1 2 3 4];
s(3).huge = [1 2 3 4; 1 2 3 4];

Тогда:

result = cell2mat(cellfun(@(x) x(1,:), {s.huge}, 'uniformoutput', false).');
...