我有4个嵌套" for"环路。
for(int i=0; i<len1; i++) {
for(int j=0; j<len2; j++) {
for(int k=0; k<len1; k++) {
for(int l=0; l<len2; l++) {
//perform some calculations/operations.
}
}
}
}
问题是,整个代码将遍历每个&#34; for&#34;的每个索引。循环从0到len1 / len2。我不希望它这样做。相反,我希望这些循环迭代某些特定的&#34;索引并跳过其余的(通过跳过我的意思是TOTAL跳过,它不应该迭代不需要的索引)。
为了给出更详细的解释,以下是运行上述代码片段时迭代的发生方式。
i j k l
0 0 0 0
0 0 0 1
0 0 0 2
0 0 0 3
. . . .
. . . .
. . . .
len1 len2 len1 len2
但我想要的是以下......
0 0 0 63
0 0 0 450
0 0 0 569
0 0 3 87
0 0 78 999
. . . .
. . . .
. . . .
29 65 99 357
29 66 21 222
. . . .
依旧...... 首先是嵌套&#34; for&#34;环
其次,最重要的是我只想用嵌套的&#34; for&#34;循环。没有其他方法。
第三,对#34;特定&#34;的迭代。我想要的指数不是随机的。
答案 0 :(得分:0)
如果您可以根据外部循环定义内部循环的起点,请确保。例如:
for(int i=0; i<len1; i++) {
for(int j=0; j<len2; j++) {
for(int k=0; k<len1; k++) {
int lStart = DetermineBasedOn(i, j, k);
for(int l=lStart; l<len2; l++) {
//perform some calculations/operations.
}
}
}
}
请注意
DetermineBasedOn(i, j, k);
不一定是实际的方法调用。您可以在循环体中设置起始索引。
如果在迭代的区域中需要 gap ,请在评论中按照@SamIAm的建议执行:提供一个函数来确定下一个索引(尽管可能基于多个变量:
for(int l=lStart; l<len2; l = GetNextIndex(l, i, j, k)) {
您可以使用相同的技术提前结束内部循环(例如设置lEnd
并使用它代替len2
)。
其次,最重要的是我只想用嵌套的&#34; for&#34;循环。没有其他方法。
do
和while
循环在功能上等同于for
循环,在这种情况下可能(或可能不)更清晰,更容易阅读。我不确定为什么偏向于其他循环结构,但你可以用for
和do
或while
完成相同的结果。
答案 1 :(得分:0)
将您的特定索引放入std::vector
,并循环显示以获得您的真实指数。使用C ++ 11,您可以使用以下语法初始化向量。
std::vector myFavoriteIndices = {5,7, 11, 8}
for(int i = 0; i < len1; i++) {
for(int j = 0; j < len2; j++) {
for(int k = 0; k < len1; k++) {
for(int l = 0; l < myFavoriteIndices.size(); l++) {
int trueIndex = myFavoriteIndices[l];
// do something with trueIndex
}
}
}
}
答案 2 :(得分:0)
如果我理解正确,你想要迭代某些索引(你有一个确定的方法吗?)。
如果您可以预先确定所需的索引,那么您可以使用索引向量。
类似的东西:
vector<int> iIdx;
vector<int> jIdx;
vector<int> kIdx;
vector<int> lIdx;
// your inside algorithm section which determines what indexes are needed for each
...
lIdx.push_back(63);
...
// the new loop
for (int i=0;i<iIdx.size();i++)
for (int j=0;j<jIdx.size();j++)
for (int k=0;k<kIdx.size();k++)
for (int l=0;l<lIdx.size();l++)
{
ii = iIdx[i];
jj = jIdx[j];
kk = kIdx[k];
ll = lIdx[l];
// use ii , jj ,kk and ll as you would use i,j,k,l on your original question
}
如果您有办法在quad循环开始之前确定这些索引,则此方法有效。
否则,你可以通过这种方法减少一些循环,你可以生成索引(例如,如果你需要知道i和j来生成k和l的索引,那么只有kIdx和lIdx将使用以上方法)。
编辑:
其他评论中注明您使用CUDA。
您可以在CPU上计算iIdx,jIdx,kIdx和lIdx数组,并在GPU上进行for循环。