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