Элементы матрицы можно задать по некоторому специальному правилу в зависимости от ее индексов. Например:
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
A[i][j] =(i+1)*(j+1);
При построении матрицы можно использовать одно число. Например, построим матрицу А для заданных значений x и n:
Алгоритм следующий: очередной элемент «периметра матрицы» получаем так: умножаем предыдущий элемент на х и помещаем его в первую и последнюю строки, в первый и последний столбцы. Для этого достаточно одного цикла. Все «центральные» элементы обнуляем.
const n=5;
double x, A[n][n], T;
cin >> x;
A[0][0] = A[n-1][n-1] =1;
T=1;
for (int i=1; i<n; i++)
{T *=x;
A[0][i] = //элементы 0-й строки
A[i][0] = //элементы 0-го столбца
A[n-1][n-1-i] = //элементы (n-1)-й строки
A[n-1-i][n-1] = T; //элементы (n-1)-го столбца
}
for (int i=1; i<n-1; i++)
for (int j=1; j<n-1; j++)
A[i][j]=0;
Матрицу можно построить, используя один или несколько одномерных массивов. Например, задано b[n]. Сформировать матрицу по следующему правилу:
В таких задачах необходимо установить, от чего и как зависят индексы элементов матрицы и, возможно, значения ее элементов. В данном случае зависимость простая, поэтому получаем:
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
A[i][j]=b[i]+j;
Новую матрицу можно построить на основе одной или нескольких определенных к этому времени матриц. Например, задана матрица C[n][n]. Получим новую матрицу A[n][n] такой же размерности по следующему правилу: положительные числа исходной матрицы увеличим в 2 раза, а отрицательные уменьшим во столько же раз:
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
{t=C[i][j];
A[i][j] = t>0 ? t*2: t/2;
}
Заметим, что старая матрица C сохранилась без изменения, а построенная разместилась на новом месте.
Если бы преобразовывалась исходная матрица, а измененные значения сохранялись на том же месте, то необходимо было записать в теле цикла:
{t=C[i][j];
С[i][j] = t>0 ? t*2: t/2;
}
Примеры
«Зеркальное отображение» матрицы относительно вертикальной оси, проходящей через ее середину