C言語で簡単な行列を作る
目的1:行列の概念を知ること。
目的2:コマンドライン入力で行列を指定してそのまま行列を出力する。
プログラミングのフロー
手順1:行列の行と列の数を指定する。
手順2:行列の各値を指定する
手順3:行列を出力する
先に行列の概念を説明してからプログラミングに入ります。
行列の概念
Q1:まず行列とはなんですか?
これは学生時代に行列について聞かれた時に詰まった質問です。
一般的に行列と呼ばれるものは次のようなものです(行が2つ、列が2つあるので2次正方行列といいます)。
\begin{bmatrix}
a & b \\
c & d
\end{bmatrix}
最初はなんか数字がかっこの中に並んでるなぁぐらいの認識であんまり考えず計算とかしていました。
大学ではめちゃくちゃ小難しい言葉で全然理解できなかった記憶があります。
行列を簡単に説明すると「次元の拡張」という言葉で表現できます。
Q2:具体例
たとえばあなたがなにかジュースを作りたいとします。
ジュースをつくるには材料、分量などを考えて作る必要がありますね。
水と言う1×1行列があるとします。
\begin{bmatrix}
水 \\
\end{bmatrix}
これだと水以外の情報がないので水=水ですね。
これだとジュースは作れそうにないです。
なので次元を拡張してジュースを作れるようにしてあげます。
\begin{bmatrix}
水 & りんご \\
500mL & 果汁100%
\end{bmatrix}
これを見るとなんとなく500mLのリンゴジュースを作れたなと理解できますね。
なので次元を拡張する→扱うデータを増やすと言えそうです。
これが何がいいかと言うと、ビッグデータを扱うときに、データの特徴を捉えたり、分析するのが可能になるわけです。
実際にはそのように簡単に理解することが難しいです。なのでデータサイエンティストとか統計、分析でご飯を食べている人がいるんですね。
C言語で行列を作ってみる
行列を作るのに必要な変数を用意する。
行列を作るのに必要な情報は
>行数(横にいくつ数字を並べるか)
>列数(行にいくつ数字を並べるか)
>出力する行列の初期化
コマンドラインから行数と列数を柔軟に変更できるようにrowとcolumn変数を用意しておきます。
変数宣言
int row;
int column;
//行列の出力を10次正方行列までに限定する
int matrix[10][10];
行列を生成する関数
void generate_matrix()
{
/* 入力した行列の表示 */
printf("\nA = \n");
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < column; ++j)
{
printf("%d ", matrix[i][j]);
if (j == column - 1)
printf("\n");
}
}
}
main処理
コマンドラインから行と列、各値を入力します。
int main(void)
{
printf("行数 = ");
scanf("%d", &row);
printf("列数 = ");
scanf("%d", &column);
/* 行列の入力 */
printf("\n行列を入力してください\n");
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < column; ++j)
{
printf("行列の要素 A[%d][%d] = ", i + 1, j + 1);
scanf("%d", &matrix[i][j]);
}
}
//行列を生成して表示
generate_matrix();
return 0;
}
ソースコードは次のGitHubにあります。
https://github.com/YUJIjs/matrix