我正在将MatLab中的一个函数转换为C ++并遇到这个问题(在matlab中):
f = blocks(min:max,1:len);
值: min = 153,max = 205
它是2D矢量。那么上面的代码行是否会创建一个新的2D向量并将“blocks”中的所有块复制到新的向量中?
所以从本质上讲,它本质上是一个循环,从153开始,结束于250,并将每个块复制到新的向量?
希望有人可以帮忙!
答案 0 :(得分:3)
该语句在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
个循环才能做到这一点。
答案 1 :(得分:2)
如果blocks
是2d矩阵,则该代码将提取其子矩阵并将其分配给变量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
答案 2 :(得分:1)
该行代码将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中那样。
<强>更新强> 否则,性能更高(因为只有一个for循环复制while行)
for(ii=0; ii<=max-min; ii++)
memcpy( &f2[ii][0], &blocks[min+ii][0], sizeof(int)*(len) );