如何在matlab中使用不同行数的不同矩阵创建矩阵?

时间:2014-10-16 01:21:20

标签: matlab matrix

我在matlab中有一个for循环,其中我想用不同行数的不同矩阵制作一个矩阵(我不知道行数的差异是多少)。例如,我有两个矩阵,分别是10x1和4x1。如何从两者中制作矩阵。(在这种情况下,我知道有什么区别,但在我的循环中,我不会知道它们的差异。)

A =

    0.1000
    0.5000
    0.6000
    0.8000
    0.3000
    0.2000
    0.7000
    0.6000
    0.1000
    1.0000

B =

    0.1000
    0.2000
    0.3000
    0.4000

C =

    0.1000    0.1000
    0.5000    0.2000
    0.6000    0.3000
    0.8000    0.4000
    0.3000       NaN
    0.2000       NaN
    0.7000       NaN
    0.6000       NaN
    0.1000       NaN
    1.0000       NaN

我希望我的最后一个矩阵像C一样。

2 个答案:

答案 0 :(得分:0)

双数组

只要结果是矩形,您就可以在MATLAB中将矩阵连接在一起来创建矩阵。 因此,根据您的示例,可以通过执行以下操作来生成新的矩阵/向量,因为串联会产生矩形输出:

u   = rand(10,1);
v   = rand(4,1);
newVector = [u;v];

但是,您不能简单地将uv连接到不同的列,因为它们的行数不同。 因此,需要填写某种类型以平衡行数:

newMatrix = [ u , [v ; zeros(length(u)-length(v),1)]];

其中不存在的v行已由0 s的向量填充。 如果您想要NaN填充,只需将零向量乘以NaN即可。 如果您不知道uv的长度是否更长,则可以执行以下操作:

maxRows   = max([length(u),length(v)]);
nFillRows = abs(length(u) - length(v));

%   The fill vector will be empty if the vector has the maximum number of rows
uColumn   = [u ; zeros( nFillRows * (length(u) ~= maxRows) ,1)];
vColumn   = [v ; zeros( nFillRows * (length(v) ~= maxRows) ,1)];

newMatrix = [uColumn,vColumn];

为了使其工作,需要知道要添加的行数。 这可以递归设置,以使newMatrix越来越大(如果size()u是矩阵而不是向量,则可能需要使用v;但是,动态增长的阵列可能会受到很大的性能影响。

Cell Arrays

如果for循环的目的是生成您想要存储并稍后使用的向量列表,则单元数组可能是一个很好的数据结构:

vectorStorage = {u,v};

由于单元格数组的每个元素都可以拥有它自己独立的数据类型,因此uv具有不同的长度并不重要。 从命令行,您将看到:

>> vectorStorage = {u,v}

vectorStorage = 

    [10x1 double]    [4x1 double]

第一个元素是向量u,第二个元素是向量v。 您可以通过在花括号中指定索引来调用存储的值:all(u == vectorStorage{1}) == 1

答案 1 :(得分:0)

如果您的第一个向量是A,请按M创建M=A,然后对于您要添加的每个新向量,您可以使用以下代码:

if length(B)>size(M,1)
    M=[M;nan(length(B)-size(M,1),size(M,2))];
    M=[M B];
else
    M=[M [B;nan(size(M,1)-length(B),1)]];
end

尽管特洛伊建议使用细胞阵列对于这种情况是个好主意。