【问题标题】:How to create a matrix out of different matrices with different number of rows in matlab?如何在matlab中用不同行数的不同矩阵创建一个矩阵?
【发布时间】:2023-03-09 16:12:01
【问题描述】:

我在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。

【问题讨论】:

  • 如果你的10x1矩阵是A,你的4x1矩阵是B,那么你可以做M=[A;B]。如果要添加另一个 Nx1 矩阵 C,请执行 M=[M;C]
  • 感谢您的回复。但我想要的是 A 和 B 的组合作为一个 10 x 2 列矩阵,对于矩阵 B 中的缺失行,其为零或 NAN。

标签: matlab matrix


【解决方案1】:

双数组

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

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

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

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

v 不存在的行已被0s 的向量填充。 如果您想要 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 越来越大(尽管如果uv 是矩阵而不是向量,则可能需要使用size());但是,动态增长的数组可能会对性能造成很大影响。

元胞数组

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

vectorStorage = {u,v};

由于元胞数组的每个元素都可以有自己独立的数据类型,uv 有不同的长度并不重要。 在命令行中,您将看到:

>> vectorStorage = {u,v}

vectorStorage = 

    [10x1 double]    [4x1 double]

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

【讨论】:

  • 感谢您的完整回答。
【解决方案2】:

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

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

虽然对于这种情况,Troy 建议使用元胞数组是个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2015-09-20
    • 1970-01-01
    • 2012-03-08
    • 2014-08-23
    • 2015-09-20
    • 2015-01-24
    相关资源
    最近更新 更多