C++行列演算 全くわかりません...

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tbys
記事: 1
登録日時: 4ヶ月前

C++行列演算 全くわかりません...

#1

投稿記事 by tbys » 4ヶ月前

学校の課題でこの関数を完成させよの所がわかりません。
2日語に提出なのですがても付けられませんのでこころやさしいお方教えて欲しいです。


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

#define ROWS 4 // サンプルデータの行数
#define COLS 5 // サンプルデータの列数 */
#define EPS 1.0E-6 // 実数値の絶対値がこの値未満ならゼロとみなす



// サンプルデータ(グローバル変数)
double SampleMat[ROWS][COLS] = {
{0.0, 7.0, -1.0, 4.0, 36.0},
{3.0, -4.0, 1.0, 0.0, 20.0},
{1.0, 2.0, 0.0, -3.0, -14.0},
{2.0, 0.0, -3.0, -1.0, -26.0}
};

//****** 行列のためのサンプルライブラリ ここから *******

// 行列データのための構造体を宣言
struct MatrixData {
int row; // 行数
int col; // 列数
double dat[100]; // 要素データ(多めに確保してある)
};

// サイズがm×nの新しい行列データを戻り値として返す(要素は未セット)
MatrixData new_matrix(int m, int n)
{
MatrixData mat;

mat.row = m;
mat.col = n;

return mat;
}

// 行列matの行数を返す
int rows_of_matrix(MatrixData mat)
{
return mat.row;
}

// 行列matの列数を返す
int cols_of_matrix(MatrixData mat)
{
return mat.col;
}

// 行列matの(i,j)要素の値を戻り値として返す
double get_matrix(MatrixData mat, int i, int j)
{
return mat.dat[i*mat.col + j];
}

// 行列matの(i,j)要素を値valに書き換えた行列データを返す
MatrixData set_matrix(MatrixData mat, int i, int j, double val)
{
mat.dat[i*mat.col + j] = val;

return mat;
}

// 行列matの全要素を画面に表示する
void show_matrix(MatrixData mat)
{
double val;
int rows, cols;
int i, j;

rows = rows_of_matrix(mat);
cols = cols_of_matrix(mat);

for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
val = get_matrix(mat, i, j);
std::cout << " " << std::fixed << std::setprecision(6) << val;
}
std::cout << std::endl;
}
std::cout << std::endl;
}

//****** 行列のためのサンプルライブラリ ここまで *******

// 行列matの第row行から下で,第col列の要素の値の絶対値が最大になる行番号を返す
int seek_max_row(MatrixData mat, int row, int col)
{
int max_row = 0;
int rows;
double max;
int i;

rows=rows_of_matrix(mat);
max_row=row;
max=std::fabs(get_matrix(mat,row,col));

for(i=row+1;1<rows;i++){
if(std::fabs(get_matrix(mat,i,col)>max)){


}

return max_row;
}

// 行列matの第row1行と第row2行を入れ替えた行列データを返す
MatrixData exchange_matrix_row(MatrixData mat, int row1, int row2)
{

// この関数を完成させよ
double v1,v2;
int j;
int cols;

cols=cols_of_matrix(mat);

for(j=0;j<cols;j++){
v1=get_matrix(mat,row1,j);
v2=get_matrix(mat,row2,j);
mat=set_matrix(mat,row1,j,v2);
mat=set_matrix(mat,row2,j,v1);
}

return mat;
}

// 行列matの第row行をk倍して,結果の行列データを返す
MatrixData mult_matrix_row_scalar(MatrixData mat, int row, double k)
{

// この関数を完成させよ

return mat;
}

// 行列matの第row1行から第row2行のk倍を引いて,結果の行列データを返す
MatrixData elim_matrix_row(MatrixData mat, int row1, int row2, double k)
{

// この関数を完成させよ

return mat;
}

int main(void)
{
MatrixData mat; // 行列データ
double p;
int i, j;

// matのサイズを設定
mat = new_matrix(ROWS, COLS);

// matにサンプル行列データをコピーして表示
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
mat = set_matrix(mat, i, j, SampleMat[j]);
}
}
show_matrix(mat);

// matの第0行から下で,第0列の要素の値の絶対値が最大になる行番号を探して表示
std::cout << seek_max_row(mat, 0, 0) << std::endl << std::endl;

// matの0行目と1行目を入れ替えて表示
mat = exchange_matrix_row(mat, 0, 1);
show_matrix(mat);

// matの0行目を(0, 0)要素で割って表示
p = get_matrix(mat, 0, 0);
if (std::fabs(p) < EPS) {
std::cout << "ゼロで除算はできません" <<std::endl;
std::cout << "プログラムを中断します" << std::endl;
std::exit(2);
}
mat = mult_matrix_row_scalar(mat, 0, 1.0/p);
show_matrix(mat);

// matについて,1行目-0行目×(1,0)要素の演算を行って,表示
p = get_matrix(mat, 1, 0);
mat = elim_matrix_row(mat, 1, 0, p);
show_matrix(mat);

// matについて,2行目-0行目×(2,0)要素の演算を行って,表示
p = get_matrix(mat, 2, 0);
mat = elim_matrix_row(mat, 2, 0, p);
show_matrix(mat);

// matについて,3行目-0行目×(3,0)要素の演算を行って,表示
p = get_matrix(mat, 3, 0);
mat = elim_matrix_row(mat, 3, 0, p);
show_matrix(mat);

return 0;
}

アバター
あたっしゅ
記事: 158
登録日時: 8年前
住所: 東京23区
連絡を取る:

Re: C++行列演算 全くわかりません...

#2

投稿記事 by あたっしゅ » 4ヶ月前

もう、課題の提出期限は過ぎているでしょうけれども、一般論として、

https://qiita.com/yohm/items/a03006790dc1e54a87be
C++行列計算ライブラリEigen入門 - Qiita

>header onlyのライブラリでインクルードパスを指定するだけで使い始めることができる。

「線形代数ソルバ」とかも、あるんで、別の方の行列の質問も解けるんじゃないの ?
手提鞄あたっしゅ、[MrAtassyu]

返信

“C言語何でも質問掲示板” へ戻る