MATLAB Конкатенатные матрицы с неодинаковыми размерами - PullRequest
3 голосов
/ 02 июня 2011

Есть ли простой способ объединить матрицы с неравными размерами, используя заполнение нулями?

short = [1 2 3]';
long = [4 5 6 7]';
desiredResult = horzcat(short, long);

Я бы хотел что-то вроде:

desiredResult = 
1 4 
2 5
3 6
0 7

Ответы [ 3 ]

5 голосов
/ 02 июня 2011

Матрицы в MATLAB автоматически растут и дополняются нулями, когда вы присваиваете индексы за пределами текущих границ матрицы.Например:

>> short = [1 2 3]';
>> long = [4 5 6 7]';
>> desiredResult(1:numel(short),1) = short;  %# Add short to column 1
>> desiredResult(1:numel(long),2) = long;    %# Add long to column 2
>> desiredResult

desiredResult =

     1     4
     2     5
     3     6
     0     7
1 голос
/ 17 мая 2014

Matlab автоматически выполняет заполнение при записи в несуществующий элемент матрицы.Поэтому еще один очень простой способ сделать это заключается в следующем:

short = [1; 2; 3];

long = [4; 5; 6; 7];

короткий (1: длина (длинный), 2) = длинный;

1 голос
/ 02 июня 2011

РЕДАКТИРОВАТЬ:

Я отредактировал свое предыдущее решение, чтобы вам не приходилось вводить параметр maxLength для функции.Функция вычисляет его перед заполнением.

function out=joinUnevenVectors(varargin)
%#Horizontally catenate multiple column vectors by appending zeros 
%#at the ends of the shorter vectors
%#
%#SYNTAX: out = joinUnevenVectors(vec1, vec2, ... , vecN)

    maxLength=max(cellfun(@numel,varargin));
    out=cell2mat(cellfun(@(x)cat(1,x,zeros(maxLength-length(x),1)),varargin,'UniformOutput',false));

Удобство использования функции в том, что вы можете легко объединять несколько неравных векторов в одну строку как joinUnevenVectors(vec1,vec2,vec3,vec4) и так далее, без необходимостивведите его вручную в каждой строке.

ПРИМЕР:

short = [1 2 3]';
long = [4 5 6 7]';
joinUnevenVectors(short,long)

ans =

     1     4
     2     5
     3     6
     0     7
...