我在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一样。
答案 0 :(得分:0)
只要结果是矩形,您就可以在MATLAB中将矩阵连接在一起来创建矩阵。 因此,根据您的示例,可以通过执行以下操作来生成新的矩阵/向量,因为串联会产生矩形输出:
u = rand(10,1);
v = rand(4,1);
newVector = [u;v];
但是,您不能简单地将u
和v
连接到不同的列,因为它们的行数不同。
因此,需要填写某种类型以平衡行数:
newMatrix = [ u , [v ; zeros(length(u)-length(v),1)]];
其中不存在的v
行已由0
s的向量填充。
如果您想要NaN填充,只需将零向量乘以NaN
即可。
如果您不知道u
或v
的长度是否更长,则可以执行以下操作:
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
;但是,动态增长的阵列可能会受到很大的性能影响。
如果for循环的目的是生成您想要存储并稍后使用的向量列表,则单元数组可能是一个很好的数据结构:
vectorStorage = {u,v};
由于单元格数组的每个元素都可以拥有它自己独立的数据类型,因此u
和v
具有不同的长度并不重要。
从命令行,您将看到:
>> 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
尽管特洛伊建议使用细胞阵列对于这种情况是个好主意。