如何在matlab中用不同行数的不同矩阵创建矩阵?
我在matlab中有一个for循环,我想用不同的矩阵和不同的行数来做一个矩阵,我不知道行数的不同是什么。例如,我有两个矩阵,分别是10x1和4x1。我怎样才能从它们两个中得到一个矩阵。在这种情况下,我知道它们的区别是什么,但在我的循环中,我不知道它们的区别如何在matlab中用不同行数的不同矩阵创建矩阵?,matlab,matrix,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 =
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。双数组
只要结果是矩形的,就可以通过将其他矩阵连接在一起在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的向量填充。
如果需要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];
为了使其工作,需要知道要添加的行数。
这可以递归设置,以使新矩阵越来越大,但如果u或v是矩阵而不是向量,则可能需要使用size;但是,动态增长的阵列可能会对性能造成很大影响
细胞阵列
如果for循环的目的是生成一个向量列表,您只需要存储这些向量并在以后使用,那么单元格数组可能是一个很好的数据结构:
vectorStorage = {u,v};
由于单元数组的每个元素都可以有自己单独的数据类型,所以u和v的长度不同并不重要。
在命令行中,您将看到以下内容:
>> vectorStorage = {u,v}
vectorStorage =
[10x1 double] [4x1 double]
第一个元素是向量u,第二个元素是向量v。
您可以通过用大括号指定索引来调用存储的值:allu==vectorStorage{1}==1。如果您的第一个向量是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建议使用单元数组对于这种情况来说是个好主意。如果10x1矩阵是a,4x1矩阵是B,那么可以使用M=[a;B]。如果要添加另一个Nx1矩阵C,请执行M=[M;C]。感谢您的回复。但是我想要的是A和B的组合,作为一个10×2列的矩阵,矩阵B中缺少的行为零或NAN。谢谢你的完整答案。