2014-11-20 71 views
1

我有一个矩阵变成一维数组。我怎么能把0放在所有的对角线上?例如,对于4x4矩阵,我想这(n=4沿着一条对角线编程0s

int j = 1; 

for (int i = 0; i < n*n; i++) 
    { 
     if (i % 4 == 0) 
     { 
      global_matrix[i + j] = 0; 
      j++; 
     } 
    } 

,但我得到这个

|  0  |  61  |  64  |  80  | 
|  0  |  16  |  35  |  15  | 
|  0  |  74  |  7  |  68  | 
|  0  |  54  |  92  |  63  | 
+2

对y和x使用索引计算'x + y * width'和两个for循环。 – 2014-11-20 22:37:11

回答

5

有无需循环遍历所有元素,并使用条件来决定哪些元素位于对角线上。在对角线元素上的简单循环就可以做到。

关键的观察结果是,每次移动到下一行时,对角元素都会移动一个位置。因此,如果您查看所有对角元素的索引,则它们的间隔为n + 1

for (int i = 0; i < n; ++i) { 
    global_matrix[i * (n + 1)] = 0; 
} 

导出此的另一种方式:当在存储在一维阵列的矩阵访问元件(i, k),指数计算是i * n + k。对于对角元素,ik是相等的,所以这个表达式变成i * n + i。应用基本代数,这等于i * (n + 1)

1

初始化J = 0,它在我的机器上工作

int main() 
{ 
    int j = 0, n=4, global_matrix[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 

    for (int i = 0; i < n*n; i++) 
    { 
     if (i % 4 == 0) 
     { 
      global_matrix[i + j] = 0; 
      j++; 
     } 
    } 
    for(int i = 0; i < n*n; i++) 
     cout<<global_matrix[i]; 
    return 0; 
}