0

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

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

具有值:最小值 = 153,最大值 = 205

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

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

希望有人能帮忙!

4

3 回答 3

3

该语句获取矩阵之间的行min和矩阵之间的max1,并将它们分配给.lenblocksf

让我们试一试:

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循环来做到这一点。

于 2012-11-16T12:52:51.813 回答
2

如果blocks是 2d 矩阵,则该代码提取它的子矩阵并将其分配给变量f。提取的子矩阵是 row minto rowmax和 column 1to column len

有关更多信息,您应该阅读内容。

如果您想在循环中执行此操作(在 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
于 2012-11-16T12:48:53.703 回答
1

那行代码将元素 [153,1] 和 [205,len] 之间的子矩阵的元素复制blocks到新创建的矩阵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) );
于 2012-11-16T13:14:51.620 回答