数学とか語学とか楽しいよね

フランス語、ドイツ語、ロシア語、アラビア語、オランダ語、英語、スペイン語、ラテン語とか数学とか数値計算(有限要素法、有限体積法、差分法、格子ボルツマン法、数理最適化、C++コード付き)とか勉強したことをまとめます。右のカテゴリーから興味のある記事を探してください。最近はクラシックの名演も紹介しています。noteにも書いています。https://note.mu/kumag_min

【数値計算】一次元配列で二次元配列を表現しよう C++コード付き

今回はC++において、一次元配列で二次元配列を表現する方法を説明します。二次元配列でコードを書くと非常に読みやすく、理解しやすいものになるのですが、二次元配列は一次元配列に比べて重いです。そこで、よく一次元配列で二次元配列を表現する方法が使われます。


簡単のため正方行列について説明します。 n \times n の行列  A を考えます。これの  i, j 成分は二次元配列を使うと

A[i][j]

と表現されます。一次元配列だけでこれを表現するには

A[i*n+j]

とします。これだけです。最初は見た目がいかつくてびびりますが、慣れると何の問題もなく使えるようになります。


例として  3 \times 3 行列  A, B の積を計算するコードを以下に示します。

#include <iostream>
#include <cmath>
#include <fstream>
#include <iomanip>
#include <cstdlib>

using namespace std;

int main()
{
	int i,j,k;
	const int n=3;
	double *A=new double[n*n];
	double *B=new double[n*n];
	double sum;

	A[0*n+0]=1.;A[0*n+1]=2.;A[0*n+2]=-2.;
	A[1*n+0]=1.;A[1*n+1]=-1.;A[1*n+2]=3.;
	A[2*n+0]=2.;A[2*n+1]=3.;A[2*n+2]=-5.;
	
	B[0*n+0]=1.;B[0*n+1]=2.;B[0*n+2]=3.;
	B[1*n+0]=4.;B[1*n+1]=5.;B[1*n+2]=6.;
	B[2*n+0]=7.;B[2*n+1]=8.;B[2*n+2]=9.;
	
	
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			sum=0.;
			for(k=0;k<n;k++)
			{
				sum+=A[i*n+k]*B[k*n+j];
			}
			
			cout<<sum<<" ";
		}
		
		cout<<endl;
	}
	
	delete [] A,B;
	return 0;
}