【问题标题】:Updated: Randomly adding in rows to a matrix but following strict rules as to where更新:随机添加行到矩阵,但遵循严格的规则
【发布时间】:2015-07-25 22:40:10
【问题描述】:

以下是一个更大的矩阵的一部分:

     0    1.0000    1.0000   77.0000  100.0000         0    0.2500
     0    1.0000    1.0000   72.0000  100.0000    0.2500    0.2500
     0    1.0000    1.0000   69.0000  100.0000    0.5000    0.2500
     0    1.0000    1.0000   48.0000  100.0000    0.7500    0.2500
1.0000    1.0000    1.0000   65.0000  100.0000    1.0000    0.2500
1.0000    1.0000    1.0000   71.0000  100.0000    1.2500    0.2500
1.0000    1.0000    1.0000   62.0000  100.0000    1.5000    0.2500
1.0000    1.0000    1.0000   41.0000  100.0000    1.7500    0.2500
2.0000    1.0000    1.0000   62.0000  100.0000    2.0000    0.2500
2.0000    1.0000    1.0000   67.0000  100.0000    2.2500    0.2500
2.0000    1.0000    1.0000   71.0000  100.0000    2.5000    0.2500
2.0000    1.0000    1.0000   43.0000  100.0000    2.7500    0.2500
3.0000    1.0000    1.0000   71.0000  100.0000    3.0000    0.2500
3.0000    1.0000    1.0000   62.0000  100.0000    3.2500    0.2500
3.0000    1.0000    1.0000   67.0000  100.0000    3.5000    0.2500
3.0000    1.0000    1.0000   47.0000  100.0000    3.7500    0.2500
4.0000    1.0000    1.0000   69.0000  100.0000    4.0000    0.2500
4.0000    1.0000    1.0000   65.0000  100.0000    4.2500    0.2500
4.0000    1.0000    1.0000   60.0000  100.0000    4.5000    0.2500
4.0000    1.0000    1.0000   41.0000  100.0000    4.7500    0.2500
5.0000    1.0000    1.0000   74.0000  100.0000    5.0000    0.2500
5.0000    1.0000    1.0000   71.0000  100.0000    5.2500    0.2500
5.0000    1.0000    1.0000   65.0000  100.0000    5.5000    0.2500
5.0000    1.0000    1.0000   47.0000  100.0000    5.7500    0.2500

等等.. 矩阵以同样的方式从这一点继续:

  • 第 1 列每 4 行以 1 秒递增:0-0-0-0-1-1-1-1-2-2-2-2...n-n-n-n
  • 第 2 列始终为 1
  • 第 3 列始终为 1
  • 第 4 列以 4 个数字为一组进行分组(例如,[77 72 69 48] 是第一组)
  • 第 5 列始终为 100
  • 第 6 列每行上升 0.25
  • 第 7 列始终为 0.25

在其构造中,矩阵被分组为 4 行块,每个块由第一列中的升序数字标记(0-0-0-0-1-1-1-1-2-2-2-2 等)。例如,第一个块是:

 0    1.0000    1.0000   77.0000  100.0000         0    0.2500
 0    1.0000    1.0000   72.0000  100.0000    0.2500    0.2500
 0    1.0000    1.0000   69.0000  100.0000    0.5000    0.2500
 0    1.0000    1.0000   48.0000  100.0000    0.7500    0.2500

整个矩阵的长度将在 1500 左右,比如说:1512

  • 我想在随机点插入另一行。它应该:

• 在第 4 列中包含数字 69

• 在第 3 列中包含数字 2

• 在第一列中包含一个与前一行中的值相比 +6 的值(即,如果前一行中的第 1 列具有值“3”,那么我希望当前行中的第 1 列具有值 9)

• 在第 6 列中包含一个值,该值在整个矩阵中保持连续上升 0.25 的模式,即。 0, 0.25。 0.5、0.75(应调整以下行中的值以继续这种模式)

• 在第 7 列中包含数字 0.25

  • 为了让事情变得更复杂,我实际上想多次执行此操作,而不仅仅是一次 - 也就是说,在整个矩阵中,我想插入许多符合此描述的单行。

  • 每个插入点应与下一个插入点相隔 80 到 200 行的原始矩阵。然而,在每个实例中 number 应该在 80 到 200 之间随机化(即第一次插入行可能在原始矩阵的 84 行之后,对于下一次插入,这一次可能在第一个之后的 196 行之后)。

• 至关重要的是,插入点不应与 4 音符组相交:

即这是一个错误的插入点:

19.0000    1.0000    1.0000   72.0000  100.0000   19.0000    0.2500
19.0000    1.0000    1.0000   67.0000  100.0000   19.2500    0.2500
19.0000    1.0000    1.0000   76.0000  100.0000   19.5000    0.2500
19.0000    1.0000    1.0000   48.0000  100.0000   19.7500    0.2500
20.0000    1.0000    1.0000   65.0000  100.0000   20.0000    0.2500
20.0000    1.0000    1.0000   69.0000  100.0000   20.2500    0.2500
26.0000    1.0000    1.0000   69.0000  100.0000   20.5000    0.2500

但这很好:

19.0000    1.0000    1.0000   72.0000  100.0000   19.0000    0.2500
19.0000    1.0000    1.0000   67.0000  100.0000   19.2500    0.2500
19.0000    1.0000    1.0000   76.0000  100.0000   19.5000    0.2500
19.0000    1.0000    1.0000   48.0000  100.0000   19.7500    0.2500
20.0000    1.0000    1.0000   65.0000  100.0000   20.0000    0.2500
20.0000    1.0000    1.0000   69.0000  100.0000   20.2500    0.2500
20.0000    1.0000    1.0000   60.0000  100.0000   20.5000    0.2500
20.0000    1.0000    1.0000   45.0000  100.0000   20.7500    0.2500
26.0000    1.0000    1.0000   69.0000  100.0000   21.0000    0.2500
  • 对于每个插入的行:插入行之后的第 1 列中的所有值都必须添加 11。

例如:

19.0000    1.0000    1.0000   72.0000  100.0000   19.0000    0.2500
19.0000    1.0000    1.0000   67.0000  100.0000   19.2500    0.2500
19.0000    1.0000    1.0000   76.0000  100.0000   19.5000    0.2500
19.0000    1.0000    1.0000   48.0000  100.0000   19.7500    0.2500
20.0000    1.0000    1.0000   65.0000  100.0000   20.0000    0.2500
20.0000    1.0000    1.0000   69.0000  100.0000   20.2500    0.2500
20.0000    1.0000    1.0000   60.0000  100.0000   20.5000    0.2500
20.0000    1.0000    1.0000   45.0000  100.0000   20.7500    0.2500
26.0000    1.0000    1.0000   69.0000  100.0000   21.0000    0.2500
32.0000    1.0000    1.0000   64.0000  100.0000   21.2500    0.2500
32.0000    1.0000    1.0000   67.0000  100.0000   21.5000    0.2500
32.0000    1.0000    1.0000   60.0000  100.0000   21.7500    0.2500
32.0000    1.0000    1.0000   36.0000  100.0000   22.0000    0.2500
33.0000    1.0000    1.0000   72.0000  100.0000   22.2500    0.2500
33.0000    1.0000    1.0000   67.0000  100.0000   22.5000    0.2500
33.0000    1.0000    1.0000   64.0000  100.0000   22.7500    0.2500
33.0000    1.0000    1.0000   43.0000  100.0000   23.0000    0.2500
  • 最后.. 对于插入行和下一个插入行之间的每个矩阵块(还包括矩阵开始和第一个插入行之间的块,以及最后插入的行和矩阵结束之间的块)我'我想在第 4 列的原始值中添加一个 1 到 12 之间的随机数。(例如(示例中的“2”“9”和“5”是“1 到 12 之间的随机数”)'inserted_row - value+2 - value+2 - value+2 - value+2.. next_inserted_row - value+9 - value+9 - value+9... next_inserted_row - value+5..' 等)

有人可以帮忙吗?

【问题讨论】:

  • 第 4 点和第 5 点非常令人困惑。第 2 点和第 3 点很容易实现。你想要的东西是固定的。
  • 嗨 Parag S. Chandakkar - 我在上面的编辑中再次解释了所有内容 - 希望现在更清楚了吗?
  • 所以棘手的部分是调整第 1 列和第 6 列以分别继续增加 +1 和 +0.25,对吗?哦,我认为第 3 列中有错字或其他内容?我在插入的值中没有看到任何 2's
  • 回顾性地将第 6 列调整为 +0.25 的增量似乎很棘手。第一列和第四列相互关联——第一列中的每个 n-n-n-n 都连接到第四列中一组特定的 4 个数字。我正在寻找在矩阵中插入一个新行,该行在第 4 列中具有“69”,并且第一列中的值与其上方行中的值相比是 +6。在插入的行之后,我希望将第一列的其余部分提高 +11。为了让事情变得更复杂,我实际上想以这种方式插入多行,每 80 到 200 行随机插入一次。
  • (问题本身写得更清楚了)。除此之外,我想在第 4 列中的值之间添加一个介于 1-12 之间的随机数,用于在任何给定的 2 个插入行之间(或者实际上在矩阵的开头和第一个插入的行之间)的行,并且在最后插入的行和矩阵的末尾之间。..正如您所提到的,第 6 列中的 +0.25 增量应该在整个过程中应用(尽管这与其余部分相比不是什么大问题)

标签: matlab matrix rows


【解决方案1】:

据我所知,这应该可以满足您的要求。原始矩阵为M

insertRange = [80 200];   %// number of lines to skip before inserting
chunkStart = 0;

while chunkStart < size(M,1)
   chunkEnd = chunkStart + randi(insertRange/4) * 4;
   %// add random value to column 4
   addedValue = randi(12);
   lastRow = min(chunkEnd,size(M,1));
   M(chunkStart+1:lastRow,4) = M(chunkStart+1:lastRow,4) + addedValue;
   if chunkEnd < size(M,1)
      %// we haven't reached the end; insert new row after chunkEnd
      newRow = M(chunkEnd,:);
      newRow(1) = newRow(1) + 6;
      newRow(3) = 2.0;
      newRow(4) = 69.0;
      newRow(6) = newRow(6) + 0.25;
      %// now adjust remaining rows (> chunkEnd)
      M(chunkEnd+1:end,1) = M(chunkEnd+1:end,1) + 11.0;
      M(chunkEnd+1:end,6) = M(chunkEnd+1:end,6) + 0.25;
      M = [M(1:chunkEnd,:); newRow; M(chunkEnd+1:end, :)];
      chunkEnd = chunkEnd+1;
   end
   chunkStart = chunkEnd;
end

这是使用较小数据集和 insertRange 运行的示例。

>> OriginalM(36:46,:)
ans =

     8.00000     1.00000     1.00000    56.00000   100.00000     8.75000     0.25000
     9.00000     1.00000     1.00000    68.00000   100.00000     9.00000     0.25000
     9.00000     1.00000     1.00000    76.00000   100.00000     9.25000     0.25000
     9.00000     1.00000     1.00000    72.00000   100.00000     9.50000     0.25000
     9.00000     1.00000     1.00000    48.00000   100.00000     9.75000     0.25000
    10.00000     1.00000     1.00000    67.00000   100.00000    10.00000     0.25000
    10.00000     1.00000     1.00000    71.00000   100.00000    10.25000     0.25000
    10.00000     1.00000     1.00000    66.00000   100.00000    10.50000     0.25000
    10.00000     1.00000     1.00000    47.00000   100.00000    10.75000     0.25000
    11.00000     1.00000     1.00000    60.00000   100.00000    11.00000     0.25000
    11.00000     1.00000     1.00000    72.00000   100.00000    11.25000     0.25000

以及在9 组之后插入新行的输出:

>> M(36:46,:)
ans =

     8.00000     1.00000     1.00000    68.00000   100.00000     8.75000     0.25000
     9.00000     1.00000     1.00000    80.00000   100.00000     9.00000     0.25000
     9.00000     1.00000     1.00000    88.00000   100.00000     9.25000     0.25000
     9.00000     1.00000     1.00000    84.00000   100.00000     9.50000     0.25000
     9.00000     1.00000     1.00000    60.00000   100.00000     9.75000     0.25000
    15.00000     1.00000     2.00000    69.00000   100.00000    10.00000     0.25000
    21.00000     1.00000     1.00000    73.00000   100.00000    10.25000     0.25000
    21.00000     1.00000     1.00000    77.00000   100.00000    10.50000     0.25000
    21.00000     1.00000     1.00000    72.00000   100.00000    10.75000     0.25000
    21.00000     1.00000     1.00000    53.00000   100.00000    11.00000     0.25000
    22.00000     1.00000     1.00000    66.00000   100.00000    11.25000     0.25000

【讨论】:

    【解决方案2】:

    这些要求并不完整;例如,您永远不会在第 2、第 5、第 6 和第 7 列中指定您想要的内容;对于那些我只是把NaNs。我也同意后一点非常令人困惑-在某些情况下,我不知道您所说的“之间”是什么意思。但是,我已经将(我认为您要求的)代码放在一起,并且无论如何应该给您正确的想法。矩阵m0就是解:

    close all 
    clear all
    clc
    
    %create q new rows in bunches of 4:
    q = 20;
    
    m0 =    [ 0    1.0000    1.0000   77.0000  100.0000         0    0.2500;...
         0    1.0000    1.0000   72.0000  100.0000    0.2500    0.2500;...
         0    1.0000    1.0000   69.0000  100.0000    0.5000    0.2500;...
         0    1.0000    1.0000   48.0000  100.0000    0.7500    0.2500;...
    1.0000    1.0000    1.0000   65.0000  100.0000    1.0000    0.2500;...
    1.0000    1.0000    1.0000   71.0000  100.0000    1.2500    0.2500;...
    1.0000    1.0000    1.0000   62.0000  100.0000    1.5000    0.2500;...
    1.0000    1.0000    1.0000   41.0000  100.0000    1.7500    0.2500;...
    2.0000    1.0000    1.0000   62.0000  100.0000    2.0000    0.2500;...
    2.0000    1.0000    1.0000   67.0000  100.0000    2.2500    0.2500;...
    2.0000    1.0000    1.0000   71.0000  100.0000    2.5000    0.2500;...
    2.0000    1.0000    1.0000   43.0000  100.0000    2.7500    0.2500;...
    3.0000    1.0000    1.0000   71.0000  100.0000    3.0000    0.2500;...
    3.0000    1.0000    1.0000   62.0000  100.0000    3.2500    0.2500;...
    3.0000    1.0000    1.0000   67.0000  100.0000    3.5000    0.2500;...
    3.0000    1.0000    1.0000   47.0000  100.0000    3.7500    0.2500;...
    4.0000    1.0000    1.0000   69.0000  100.0000    4.0000    0.2500;...
    4.0000    1.0000    1.0000   65.0000  100.0000    4.2500    0.2500;...
    4.0000    1.0000    1.0000   60.0000  100.0000    4.5000    0.2500;...
    4.0000    1.0000    1.0000   41.0000  100.0000    4.7500    0.2500;...
    5.0000    1.0000    1.0000   74.0000  100.0000    5.0000    0.2500;...
    5.0000    1.0000    1.0000   71.0000  100.0000    5.2500    0.2500;...
    5.0000    1.0000    1.0000   65.0000  100.0000    5.5000    0.2500;...
    5.0000    1.0000    1.0000   47.0000  100.0000    5.7500    0.2500];
    
    L = length(m0);
    %find random insert point:
    insert_index = 4*(randi(L/4));
    col1_val = m0(insert_index,1);
    
    for j2 = 1:q
        added_random = randi(12);
        for j3 = 1:4
           index = (j2-1)*4 + j3;
           m_insert(index,:) = [ col1_val + 6, nan ,2 ,69 + added_random ,nan ,nan ,nan ];
        end 
        col1_val = col1_val + 1;
    
    end
    
    mfirst = m0(1:insert_index,:);
    mlast = m0(insert_index+1:end,:);
    m0 = [mfirst;m_insert;mlast];
    

    【讨论】:

    • 这对您有帮助吗?如果不是您想要的,则不需要太多修改。
    • 遗憾的是,它并没有真正的帮助 - 您的代码采用了我最初给您的矩阵,并设法在随机点将模式向前跳跃 6,同时保持“4s 分组”结构。但是,您没有插入单行,而是插入了很多行,所有行在第 3 列都有一个 2,然后模式又一直跳回到开头......我认为我的原始帖子必须一直不清楚,所以我现在在上面的编辑中更清楚地解释了一切 - 有什么帮助吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2013-02-12
    • 2017-12-14
    • 2021-07-14
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多