c ++中循环的第一个值与其他循环不同

时间:2016-01-08 21:40:04

标签: c++ matlab

我需要将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

2 个答案:

答案 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,然后在每次迭代时继续添加它。