Объединение матриц разных размеров с заполнением

#matlab #matrix #concatenation

#matlab #матрица #объединение

Вопрос:

Я хотел бы объединить по вертикали несколько матриц с разными размерами: 180 x n double с n> = 7. Чтобы эти матрицы имели одинаковые размеры, я хочу добавить 0 в качестве заполнителей. Однако есть одно предостережение: заполнители должны идти перед последними 7 столбцами в каждом оригинале, что означает, что после конкатенации последние 7 столбцов (справа) всегда остаются неизменными. Вот пример с 3 матрицами для объединения:

 R1 is 180 x 13 double
R2 is 180 x 7 double
R3 is 180 x 10 double
  

Я хочу создать R_concat = 540 x 13 double (540 = 180×3, 13 — наибольшее количество столбцов в трех объединяемых матрицах). Таким образом, новые матрицы с менее чем 13 столбцами должны быть дополнены, чтобы иметь 13 столбцов. Поскольку R1 имеет наибольшее количество столбцов, заполнение не требуется. Для R2 требуется 6 дополнительных столбцов нулей (180×6, чтобы быть более точным). Эти столбцы необходимо будет добавить в качестве первых 6 столбцов, чтобы за ними последовали 7 исходных столбцов. Для R3 необходимы 3 дополнительных столбца с нулями, но эти дополнительные столбцы будут находиться между исходными 3 и 4 столбцами. Таким образом, исходные 7 последних столбцов (т. Е. От столбца 4 до столбца 10) по-прежнему являются 7 последними столбцами в новой матрице (но теперь они будут столбцами с 6 по 13).

Прошу прощения, если это объяснение несколько неуклюжее. Кто-нибудь может помочь?

Ответ №1:

* поместите матрицы в массив ячеек

* использование cellfun применения заполнения к каждой матрице

* использование cell2mat объединенных матриц

 %place matrices into a cell 
matrices = {rand(5,13),rand(5,7),rand(5,10)};
% column number that padding should be applied before it
pad_column = 7;
%find maxmum of number of columns of matrices
sz=cellfun('size',matrices,2);
mx = max(sz);
%pad each matrix
padded = cellfun(...
                @(M)...
                    [...
                        M(:,1:end-pad_column),...
                        zeros(size(M,1),mx-size(M,2)),...
                        M(:,end-pad_column 1:end)...
                    ],...
                matrices,...
                'UniformOutput', false...
                );
%concatenate matrices
out = cell2mat(padded.');