#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).');