Быстрый способ объединения сложных данных с помощью vertcat с пользовательскими строками

#matlab #data-structures #concatenation #concat

#matlab #структуры данных #объединение

Вопрос:

Мне нужно объединить несколько больших матриц, но определенным образом — например, объединить только 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?

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

Комментарии:

1. «Существует хорошее решение для хранения данных в структуре» Как вы можете видеть в ответе ниже, еще лучшим решением является использование массива ячеек. Если в каждом элементе массива есть только одна вещь (как в данном случае, struct(ii).huge ), вам не нужно это huge имя там.

Ответ №1:

В этом случае трудно избежать цикла. Вы можете преобразовать поле структуры в ячейку и затем использовать 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).');