正方行列を対称行列と交代対称行列の和に分解する方法
対称行列とは
対称行列 ― 転置行列が元の行列そのものと等しい行列は、「対称行列」と呼ばれます。つまり、A = AT が成り立つ行列です。
交代対称行列(スキュー対称行列)とは
交代対称行列 ― 転置行列が元の行列の符号を反転したもの(-1倍)と等しい行列は、「交代対称行列(スキュー対称行列)」と呼ばれます。つまり、AT = -A が成り立つ行列です。
任意の正方行列は、必ずある対称行列と交代対称行列の和として表すことができます。この2つの行列を求めるには、以下の公式を使用します。
分解の公式
A を正方行列とすると、次のように表せます。
A = (½) × (A + AT) + (½) × (A - AT)
ここで、AT は行列 A の転置行列です。
- (½)(A + AT) は対称行列になります。
- (½)(A - AT) は交代対称行列になります。
C++による実装例
#include <bits/stdc++.h>
using namespace std;
#define N 3
void printMatrix(float mat[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
cout << mat[i][j] << " ";
cout << endl;
}
}
int main() {
float mat[N][N] = { { 2, -2, -4 },
{ -1, 3, 4 },
{ 1, -2, -3 } };
float tr[N][N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
tr[i][j] = mat[j][i];
float symm[N][N], skewsymm[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
symm[i][j] = (mat[i][j] + tr[i][j]) / 2;
skewsymm[i][j] = (mat[i][j] - tr[i][j]) / 2;
}
}
cout << "Symmetric matrix-" << endl;
printMatrix(symm);
cout << "Skew Symmetric matrix-" << endl;
printMatrix(skewsymm);
return 0;
}出力結果
Symmetric matrix - 2 -1.5 -1.5 -1.5 3 1 -1.5 1 -3 Skew Symmetric matrix - 0 -0.5 -2.5 0.5 0 3 2.5 -3 0
結果の検証
出力された対称行列と交代対称行列の対応する要素同士を足し合わせると、元の行列 {2, -2, -4}、{-1, 3, 4}、{1, -2, -3} に戻ることが確認できます。
また、交代対称行列の対角成分がすべて 0 になっている点にも注目してください。これは交代対称行列の重要な性質であり、AT = -A より対角成分は必ず 0 になります。さらに、対称行列側は転置しても元のまま変わらないことも確認できます。
-
【C言語】奇数次正方行列の中央の行と列の積を求める方法
はじめに 正方行列 mat[row][column](行数と列数が等しい行列)を考えます。このとき、行と列の長さが奇数、つまり 2 で割り切れない値である場合、その行列の中央の行と中央の列に含まれる各要素の積を求めるのが本記事の目的です。 たとえば下図のような 3×3 の行列では、2 行目が中央の行、2 列目が中央の列に相当します。 制約条件 入力は必ず正方行列(行数 = 列数)であること。 行と列の長さは必ず奇数であること。 入出力例 例 1 入力: mat[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} 出力: 中央の行の積 = 120 中央の列の積
-
Cプログラムで2次元行列の四隅の要素とその合計を出力する方法
概要 サイズ2×2以上の2次元配列(行列)が与えられたとき、その四隅に格納されているすべての要素を取り出し、合計を求めて出力するのが本記事のテーマです。 四隅の要素とは? 行数「r」、列数「c」(いずれも0から開始)をもつ行列 mat[r][c] を考えると、四隅の要素は次の4つになります。 左上:mat[0][0] 右上:mat[0][c-1] 左下:mat[r-1][0] 右下:mat[r-1][c-1] したがって、求める合計は次の式で表されます。mat[0][0] + mat[0][c-1] + mat[r-1][0] + mat[r-1][c-1]これらの四隅の要素を取得して加算