2014-11-20 3 views
1

У меня есть матрица, сплющенная в 1-й массив. Как я могу поставить 0 во все диагонали? Пример, для 4x4 матрицы, я попробовал это (n=4)Программирование 0 по диагонали

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

Используйте индексный индекс 'x + y * width' и два для циклов для y и x. –

ответ

5

Там в нет необходимости перебирать все элементы для этого и использовать условие, чтобы решить, какие из них находятся по диагонали. Простой цикл над диагональными элементами n.

Главное, что диагональный элемент сдвигается на одну позицию каждый раз, когда вы переходите к следующему ряду. Поэтому, если вы посмотрите на индексы всех диагональных элементов, они разнесены на n + 1.

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

Другой способ получения этого: При обращении к элементу (i, k) в матрице, хранящейся в массиве 1D, вычисление индекса i * n + k. Для диагональных элементов i и k равны, поэтому это выражение становится i * n + i. Применяя базовую алгебру, она равна i * (n + 1).

1

Initialize 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; 
} 
Смежные вопросы