沿对角线编程0

jsa*_*san 1 c++ arrays matrix

我有一个矩阵扁平成一维阵列.我怎么能把0所有的对角线放进去?例如,对于4x4矩阵,我试过这个(n=4)

int j = 1;

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

但我明白了

|       0       |       61      |       64      |       80      |
|       0       |       16      |       35      |       15      |
|       0       |       74      |       7       |       68      |
|       0       |       54      |       92      |       63      |
Run Code Online (Sandbox Code Playgroud)

Ret*_*adi 5

没有必要为此循环所有元素,并使用条件来决定哪些元素在对角线上.对n角元素的简单循环就可以了.

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

for (int i = 0; i < n; ++i) {
    global_matrix[i * (n + 1)] = 0;
}
Run Code Online (Sandbox Code Playgroud)

另一种推导方法:当访问(i, k)存储在一维数组中的矩阵中的元素时,索引计算是i * n + k.对于对角元素,i并且k是相等的,所以这个表达式变成了i * n + i.应用基本代数,这等于i * (n + 1).