我正在将 MatLab 中的一个函数转换为 C++ 并遇到这个(在 matlab 中):
f = blocks(min:max,1:len);
具有值:最小值 = 153,最大值 = 205
它是一个二维向量。那么上面的代码行是否创建了一个新的二维向量并将“块”内的所有块复制到新向量中?
所以本质上,它本质上是一个循环,从 153 开始,到 250 结束,并将每个块复制到新向量?
希望有人能帮忙!
该语句获取矩阵之间的行min
和矩阵之间的max
列1
,并将它们分配给.len
blocks
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
循环来做到这一点。
如果blocks
是 2d 矩阵,则该代码提取它的子矩阵并将其分配给变量f
。提取的子矩阵是 row min
to rowmax
和 column 1
to 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
那行代码将元素 [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) );