从for循环中,如何将不同长度的向量存储到单个矩阵中

时间:2015-10-31 02:08:25

标签: matlab for-loop matrix vector

我是Matlab和编程的新手。我正在尝试编写一个for循环,我可以将生成的不均匀长度向量保存到矩阵中。

这是我的基本循环:

G1 = [1 2 3 4];
for G1 = G1(1:end)
y = randn(1,G1)
end

我喜欢将y的所有值保存在矩阵的连续行中,如下所示:

enter image description here

我首先尝试将y初始化为零矩阵并运行for循环:

G1 = [1 2 3 4];
for G1 = G1(1:end)
y = zeros(4,4)
y(G1,:) = randn(1,G1)
end

错误是“订阅分配维度不匹配”。我还尝试了for循环的其他变体,所有都首先初始化零矩阵,但我收到了相同的错误消息。我该怎么做呢?谢谢!

1 个答案:

答案 0 :(得分:2)

对您的问题的简短回答是:

y = tril(randn(4));

这将返回lower triangular大小为4的方阵的normally distributed random numbers部分。

注意我对4进行了硬编码,但您可以轻松地将其替换为max(G1)length(G1)

至于第一个代码块,您应该注意:

  1. 当您定义for循环时,您将覆盖变量G1。使用另一个变量作为计数器,例如counter;
  2. 每个循环都会覆盖变量y。当你试图在第二次尝试中修复时,你似乎已经注意到了它。但是你没有考虑到randn(1,G1)每次迭代都会给你不同长度的vecors,如果你不注意就会导致尺寸不匹配错误。
  3. 对于第二个代码段:

    1. y = zeros(4,4)在循环内初始化。这意味着之后分配给它的任何数据都会在每个循环中消失。你需要在 for循环之前初始化你的vector ;
    2. 第一个片段的相同观察结果也适用。
    3. 最后,在更正后你应该有一个完整的代码如下:

      G1=1:4;
      y=zeros(4);
      for counter=1:4
      y(counter,1:counter)=randn(1,counter);
      end
      >> y
      y =
      
        -0.43911   0.00000   0.00000   0.00000
         0.09520  -0.21825   0.00000   0.00000
         0.32569   1.04944  -1.19666   0.00000
         0.25531   0.68336  -1.02413   0.72696
      

      注意y(counter,1:counter)=randn(1,counter);中的索引以避免不匹配错误。