Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9525

C#で行列計算

$
0
0
C#で行列計算 久しぶりの投稿です。 ずっと前に、C#で行列計算をしてディープラーニングをするプログラムを作りました。(過去の記事を参照してください) その時問題だったのは、行列計算するクラスが非常に使いにくかったことです。 今回、そのクラスを0から作り直して使い勝手の良いものを作ろうと思いました。 そして、できあがったのは↓これです。 まだ、行列の足し算しかできませんが、今後引き算、掛け算、転置行列ができるようにして、ディープラーニングをやってみたいと思います。 行列計算クラス Matrix.cs namespace Matrix2 { class Matrix_code { private int code_number; public int Code_number { get { return code_number; } } /// <summary> /// 0:正常 /// 1:配列要素数オーバー /// </summary> /// <param name="c"></param> public Matrix_code(int c) { code_number = c; } } class Matrix { private double[] data = new double[150]; private int _x, _y; public int _X { get { return _x; } //set //{ // _x = value; //} } public int _Y { get { return _y; } //set //{ // _y = value; //} } public double this[int x, int y] //行列の各要素を取得、設定するインデクサー { set { data[((y - 1) * _y) + x - 1] = value; } get { return data[((y - 1) * _y) + x - 1]; } } public Matrix(int x,int y) { _x = x; _y = y; } public Matrix_code setValue(params double[] v) //行列のデータを設定する { if (v.Length > _x * _y) return new Matrix_code(1); for (int i = 0; i < v.Length; i++) { data[i] = v[i]; } return new Matrix_code(0); } public Matrix_code setValue(Matrix matrix) { if ((_x != matrix._x) || (_y != matrix._y)) return new Matrix_code(1); data = matrix.data; return new Matrix_code(0); } public static Matrix operator+(Matrix m1,Matrix m2) //行列の足し算 { if ((m1._x != m2._x) || (m1._y != m2._y)) return new Matrix(1, 1); Matrix matrix = new Matrix(m1._x, m1._y); for (int i = 0; i < m1._x * m1._y; i++) { matrix.data[i] = m1.data[i] + m2.data[i]; } return matrix; } public static Matrix operator +(double v, Matrix m) { Matrix matrix = new Matrix(m._x, m._y); for (int i = 0; i < m._x * m._y; i++) { matrix.data[i] = m.data[i] + v; } return matrix; } public static Matrix operator +(Matrix m, double v) { Matrix matrix = new Matrix(m._x, m._y); for (int i = 0; i < m._x * m._y; i++) { matrix.data[i] = m.data[i] + v; } return matrix; } } } 使用例 Form1.cs using System; using System.Windows.Forms; namespace Matrix2 { public partial class Form1 : Form { Matrix m1 = new Matrix(2, 2); //2✕2の行列 Matrix m2 = new Matrix(2, 2); //2✕2の行列 public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) //ボタン1が押されたとき { m1.setValue( 1, 2, 3, 4); //m1 に行列のデータセット m2.setValue( 10, 11, 12, 13); //m2 に行列のデータセット Matrix m; m = m1 + m2; //足し算 label1.Text = m[1, 2].ToString(); //要素(1,2)を取得し、ラベル1に表示 } } }

Viewing all articles
Browse latest Browse all 9525

Trending Articles