【问题标题】:Adding elements to Vector?向 Vector 添加元素?
【发布时间】:2012-11-16 22:19:39
【问题描述】:

我正在将 MatLab 中的一个函数转换为 C++ 并遇到这个(在 matlab 中):

  f = blocks(min:max,1:len);

值:min = 153,max = 205

它是一个二维向量。那么上面这行代码是否创建了一个新的二维向量并将“块”内的所有块复制到新向量中?

所以本质上,它本质上是一个循环,从 153 开始,到 250 结束,并将每个块复制到新向量?

希望有人可以提供帮助!

【问题讨论】:

    标签: matlab vector


    【解决方案1】:

    该语句从blocks 矩阵中获取minmax 之间的行以及1len 之间的列,并将它们分配给f

    让我们试一试:

    M = magic(5) % gives
    
    M =
    
        17    24     1     8    15
        23     5     7    14    16
         4     6    13    20    22
        10    12    19    21     3
        11    18    25     2     9
    
    M2 = M(2:4,1:3) % rows 2 to 4, columns 1 to 3
    
    M2 =
    
        23     5     7
         4     6    13
        10    12    19
    

    我不太了解 C++,但您可能需要 2 个 for 循环才能做到这一点。

    【讨论】:

      【解决方案2】:

      如果blocks 是一个二维矩阵,该代码会提取它的一个子矩阵并将其分配给变量f。提取的子矩阵是行min 到行max 和列1 到列len

      更多信息,你应该阅读this

      如果您想在循环中执行此操作(在 matlab 中效率不高,但我不知道您将如何在 C++ 中解决它),它与以下内容相同:

      f = NaN(max-min+1,len); % allocate memory for f
      for rowi=1:(max-(min-1))
          f(rowi,:) =  blocks(rowi + min-1, 1:len);
      end
      

      【讨论】:

        【解决方案3】:

        该行代码将blocks的元素[153,1]和[205,len]之间的子矩阵的元素复制到新创建的矩阵f。 移植到 C 中:

        int f[max-min+1][len]; // or float or whatever
        for(int ii=0; ii<=max-min; ii++)
            for(int jj=0; jj<len; jj++)
                f[ii][jj] = blocks[ii+min][jj];
        

        我现在假设 min 和 max 包含从 0 开始计数的索引(即:152 和 204),而不是 1,就像您在 matlab 中所做的那样。

        更新: 否则,性能更高(因为只有一个复制 while 行的 for 循环)

        for(ii=0; ii<=max-min; ii++)
            memcpy( &f2[ii][0], &blocks[min+ii][0], sizeof(int)*(len) );
        

        【讨论】:

          猜你喜欢
          • 2016-04-06
          • 1970-01-01
          • 2014-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-20
          • 2021-09-28
          • 1970-01-01
          相关资源
          最近更新 更多