如何循环矩阵让对角线上的数字具有高优先级?
Posted
技术标签:
【中文标题】如何循环矩阵让对角线上的数字具有高优先级?【英文标题】:how to loop a matrix let the number on the diagonal has high priority? 【发布时间】:2014-10-17 06:16:46 【问题描述】:我正在做一个需要在二维数组(矩阵)中找到某个数字的项目。矩阵顺序的访问顺序是这样的(4 * 4矩阵)。现在我站在0的位置。等价的,我想先访问对角线的矩阵元素。
0 2 7 14
3 1 5 12
8 6 4 10
15 13 11 9
此外,如何在不使用 goto 语句的情况下打破 c++ 中的两个嵌套循环。
【问题讨论】:
你的理解说要做什么..意思是想用2个for循环遍历 直到现在,我必须逐行访问矩阵元素。矩阵体积小,但访问操作会执行多次。 【参考方案1】:以下代码将遍历任意大小的方阵,对角线优先
#define SIZE 4
static int test[SIZE][SIZE] =
0, 2, 7, 14 ,
3, 1, 5, 12 ,
8, 6, 4, 10 ,
15, 13, 11, 9
;
int main( void )
int diagonal, delta;
for ( diagonal = 0; diagonal < SIZE; diagonal++ )
cout << test[diagonal][diagonal] << endl;
for ( delta = 1; delta <= diagonal; delta++ )
cout << test[diagonal-delta][diagonal] << endl;
cout << test[diagonal][diagonal-delta] << endl;
这是在没有 goto 的情况下跳出嵌套循环的一种方法
done = false;
for ( i = 0; i < 10; i++ )
for ( j = 0; j < 10; j++ )
if ( some_condition_is_met )
done = true;
break;
if ( done )
break;
【讨论】:
【参考方案2】:使用另一个带有数组索引的数组(因为你的数组的大小可能是恒定的),例如,如果你将第一个数组存储在一维 c++ 数组中,那么
int actual_arr[16];
int indices[16] = 0, 5, 1, 4, 10, 6, 9, 2, 8, 15, 11, 14, 7, 13, 3, 12 ;
那么你可以写一个循环:
for (int i = 0; i < 16; ++i)
actual_arr[indices[i]]++;
所以索引中的每个字段都是actual_arr 的索引,此时将访问该索引。
如果需要,您也可以使用二维表示来实现。只需将 int indices[16]
替换为 std::pair<int, int> indices[16]
即可。
特别是当您有一个固定大小的数组并多次访问它时,这是一个很好的解决方案,因为它不涉及循环中的任何计算。
顺便说一句。作为旁注,从数学上讲,索引数组将被称为排列,并且可以是permutations group 中的操作。
【讨论】:
【参考方案3】:要移动到右侧的元素,请增加一行。 要移动到左侧的元素,请递减一行。 要移动到下面的元素,请增加一列。 要移动到上面的元素,请减少列。 现在要沿对角线移动,观察行和列如何变化并应用上述组合。
【讨论】:
以上是关于如何循环矩阵让对角线上的数字具有高优先级?的主要内容,如果未能解决你的问题,请参考以下文章