我需要将loop的第一个值设为0,然后使用一个范围来启动循环。
在MatLab中这是可能的:x = [0-range:range](范围是整数) 这将给出[0,-range,-range + 1,-range + 2,....,range-1,range]的值
问题是我需要在C ++中执行此操作,我尝试通过数组执行此操作,然后像循环中的值一样放入,但没有成功。
//After loading 2 images, put it into matrix values and then trying to compare each one.
for r=1:bRows
for c=1:bCols
rb=r*blockSize;
cb=c*blockSize;
%%for each block search in the near position(1.5 block size)
search=blockSize*1.5;
for dr= [0 -search:search] //Here's the problem.
for dc= [0 -search:search]
%%check if it is inside the image
if(rb+dr-blockSize+1>0 && rb+dr<=rows && cb+dc-blockSize+1>0 && cb+dc<=cols)
%compute the error and check if it is lower then the previous or not
block=I1(rb+dr-blockSize+1:rb+dr,cb+dc-blockSize+1:cb+dc,1);
TE=sum( sum( abs( block - cell2mat(B2(r,c)) ) ) );
if(TE<E)
M(r,c,:)=[dr dc]; %store the motion vector
Err(r,c,:)=TE; %store th error
E=TE;
end
end
end
end
%reset the error for the next search
E=255*blockSize^2;
end
端
答案 0 :(得分:2)
C ++本身并不支持MatLab所知道的那种范围,尽管external solutions可用,如果你的用例有点过分。但是,C ++允许您使用语言提供的原语(例如for
循环和可调整大小的数组)轻松(高效)地实现它们。例如:
// Return a vector consisting of
// {0, -limit, -limit+1, ..., limit-1, limit}.
std::vector<int> build_range0(int limit)
{
std::vector<int> ret{0};
for (auto i = -limit; i <= limit; i++)
ret.push_back(i);
return ret;
}
生成的矢量可以很容易地用于迭代:
for (int dr: build_range0(search)) {
for (int dc: build_range0(search)) {
if (rb + dr - blockSize + 1 > 0 && ...)
...
}
}
上面当然浪费了一些空间来创建一个临时向量,只是扔掉它(我怀疑它也发生在你的MatLab例子中)。如果您想迭代这些值,则需要将build_range0
中的循环直接合并到函数中。这有可能降低可读性并引入重复。为了保持代码的可维护性,您可以将循环抽象为一个通用函数,该函数接受循环体的回调:
// Call fn(0), fn(-limit), fn(-limit+1), ..., fn(limit-1), and fn(limit)
template<typename F>
void for_range0(int limit, F fn) {
fn(0);
for (auto i = -limit; i <= limit; i++)
fn(i);
}
通过将循环体提供为匿名函数,可以使用上述函数来实现迭代:
for_range0(search, [&](int dr) {
for_range0(search, [&](int dc) {
if (rb + dr - blockSize + 1 > 0 && ...)
...
});
});
(请注意,两个匿名函数都通过引用捕获封闭变量,以便能够改变它们。)
答案 1 :(得分:2)
阅读你的评论,你可以做这样的事情
for (int i = 0, bool zero = false; i < 5; i++)
{
cout << "hi" << endl;
if (zero)
{
i = 3;
zero = false;
}
}
这将从0开始,然后在做我想做的事情之后,给i指定值3,然后在每次迭代时继续添加它。