|
以前こちらの過去ログから複素数の逆行列を求めてみました。しかし成分が対角行列と上1、下1対角行列以外はゼロをいれるので、もっとすっきりさせたいと思っています。以下のようなプログラムをいれることは考えているのですが、「定式化されていない項はゼロ」という命令はどのようにすればよいのでしょうか。
int i, j, m;
j=i-1, m=i+1;
const int A[j][i]=std::complex<double>(1.0,0);
const int A[i][i]=std::complex<double> (-2.0,2.0);
const int A[i][m]=std::complex<double>(1.0,0);
ここからは逆行列を求めるプログラムです。
#include <iostream>
#include <complex>
typedef std::complex<double> Csd;
void inv_complex(Csd a[3][3], int n);
int main()
{
Csd A[3][3], invA[3][3], res[3][3];
int i, j;
A[0][0]=Csd(-2,2) ;A[0][1]=Csd(1,0); A[0][2]=Csd(0,0);
A[1][0]=Csd(1,0); A[1][1]=Csd(-2,2);A[1][2]=Csd(1,0);
A[2][0]=Csd(0,0); A[2][1]=Csd(1,0); A[2][2]=Csd(-2,2);
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
invA[i][j] = A[i][j];
inv_complex(invA, 3);
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++)
std::cout << invA[i][j] << " ";
std::cout << std::endl;
}
}
void inv_complex(Csd a[3][3], int n)
{
Csd p, q;
int i, j, k;
for (k = 0; k < n; k++) {
p = a[k][k];
a[k][k] = Csd(1, 0);
for (j = 0; j < n; j++) a[k][j] /= p;
for (i = 0; i < n; i++)
if (i != k) {
q = a[i][k];
a[i][k] = Csd(0, 0);
for (j = 0; j < n; j++) a[i][j] -= q * a[k][j];
}
}
}
|