MATLAB连接不同维度的矩阵

3
有没有一种简单的方法可以使用零填充来连接不同维度的矩阵?
short = [1 2 3]';
long = [4 5 6 7]';
desiredResult = horzcat(short, long);

我希望你能提供类似以下内容的东西:

我想要像这样的东西:

desiredResult = 
1 4 
2 5
3 6
0 7
3个回答

5

在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

编辑:

我已经编辑了之前的解决方案,这样你就不必向函数提供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

可以工作,但是我正在寻找一种不强制使用 maxLength 参数的函数。 - Jonathan Baran
1
@Jonathan:maxLength可以包含在函数内部,这样你就不需要计算它了。我在这个答案中使用了这种方法。所以只需将maxLength=max(cell2mat(cellfun(@(x)numel(x),vectors,'UniformOutput',false)));包含在函数内部,而不是作为最后一个参数输入。使用函数更简单,因为将多个向量连接成一行命令变为joinUnevenVectors(a,b,c,d,e),而不是手动分开输入在不同的行上。 - user616736

1

当写入矩阵中不存在的元素时,Matlab会自动进行填充。

因此,另一种非常简单的方法是:

short=[1;2;3];

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

short(1:length(long),2)=long;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接