LANGUAGE | スカ友 | 俺、関東の国王だけど 人類の品種 言葉の起源 虫は宇宙人です 日本語は海豚の言葉に由来します ペンギン(ウルトラマン) 日本語と中国語との同源語 関東無政府主義国へようこそ! simulationライブラリで純粋な関数式プログラミングを もっと見る
関東人です(*中国在住)
ですから、日本の書籍を代理購入する方を募集します
スカID takaku1024
携帯 +86 186 5557 4110
どうもありがとうございます!!!
matrixのライブラリ(C#版 & F#版)
0   関東の国王      2020年2月21日 金 15:00
using System;
using System.Collections.Generic;
using System.Text;

namespace Takaku
{
   class Matrix
   {
       double[,] m;
       public Matrix(int rows, int cols) { m = new double[rows, cols]; }
       public double this[int i, int j]
       {
           get { return m[i - 1, j - 1]; }
           set { m[i - 1, j - 1] = value; }
       }
       public int Rows { get { return m.GetLength(0); } }
       public int Cols { get { return m.GetLength(1); } }
       public Matrix T()
       {
           Matrix ret = new Matrix(Cols, Rows);
           for (int i = 0; i < Rows; i++)
               for (int j = 0; j < Cols; j++)
                   ret.m[j, i] = m[i, j];
           return ret;
       }
       public static Matrix Identity(int n)
       {
           Matrix ret = new Matrix(n, n);
           for (int i = 0; i < n; i++)
               ret.m[i, i] = 1.0;
           return ret;
       }
       public static Matrix operator +(Matrix x, Matrix y)
       {
           if (x.Rows != y.Rows || x.Cols != y.Cols) throw new Exception();
           Matrix ret = new Matrix(x.Rows, x.Cols);
           for (int i = 0; i < ret.Rows; i++)
               for (int j = 0; j < ret.Cols; j++)
                   ret.m[i, j] = x.m[i, j] + y.m[i, j];
           return ret;
       }
       public static Matrix operator -(Matrix x, Matrix y)
       {
           if (x.Rows != y.Rows || x.Cols != y.Cols) throw new Exception();
           Matrix ret = new Matrix(x.Rows, x.Cols);
           for (int i = 0; i < ret.Rows; i++)
               for (int j = 0; j < ret.Cols; j++)
                   ret.m[i, j] = x.m[i, j] - y.m[i, j];
           return ret;
       }
       public static Matrix operator *(double k, Matrix x)
       {
           Matrix ret = new Matrix(x.Rows, x.Cols);
           for (int i = 0; i < ret.Rows; i++)
               for (int j = 0; j < ret.Cols; j++)
                   ret.m[i, j] = k * x.m[i, j];
           return ret;
       }
       public static Matrix operator *(Matrix x, double k) { return k * x; }
       public static Matrix operator /(Matrix x, double k) { return (1.0 / k) * x; }
       public static Matrix operator *(Matrix x, Matrix y)
       {
           if (x.Cols != y.Rows) throw new Exception();
           int M = x.Rows;
           int S = x.Cols;
           int N = y.Cols;
           Matrix ret = new Matrix(M, N);
           for (int i = 0; i < M; i++)
               for (int j = 0; j < N; j++)
                   for (int k = 0; k < S; k++)
                       ret.m[i, j] += + x.m[i, k] + y.m[k, j];
           return ret;
       }
       public static double Dot(Matrix x, Matrix y)
       {
           if ((x.Rows != 1 && x.Cols != 1) || (y.Rows != 1 && y.Cols != 1)) throw new Exception();
           double ret = 0.0;
           if (x.Rows == 1)
           {
               if (y.Rows == 1)
               {
                   if (x.Cols != y.Cols) throw new Exception();
                   for (int i = 0; i < x.Cols; i++)
                       ret += x.m[0, i] * y.m[0, i];
               }
               else // y.Cols == 1
               {
                   if (x.Cols != y.Rows) throw new Exception();
                   for (int i = 0; i < x.Cols; i++)
                       ret += x.m[0, i] * y.m[i, 0];
               }
           }
           else // x.Cols == 1
           {
               if (y.Rows == 1)
               {
                   if (x.Rows != y.Cols) throw new Exception();
                   for (int i = 0; i < x.Rows; i++)
                       ret += x.m[i, 0] * y.m[0, i];
               }
               else // y.Cols == 1
               {
                   if (x.Rows != y.Rows) throw new Exception();
                   for (int i = 0; i < x.Rows; i++)
                       ret += x.m[i, 0] * y.m[i, 0];
               }
           }
           return ret;
       }
       public double Norm() { return Math.Sqrt(Dot(this, this)); }
       public Matrix Normalize() { return this / Norm(); }
       public delegate double _Each_F(double x);
       public Matrix Each(_Each_F f)
       {
           Matrix ret = new Matrix(Rows, Cols);
           for (int i = 0; i < Rows; i++)
               for (int j = 0; j < Cols; j++)
                   ret.m[i, j] = f(m[i, j]);
           return ret;
       }
   }
}
1   関東の国王      2020年2月21日 金 15:00
open System
open Microsoft.FSharp.Collections

type Matrix = class
   val m : float[,]
   new (rows : int, cols : int) =
       {
           m = Array2D.create rows cols 0.0
       }
   member x.Item
       with get (i, j) = x.m.[i - 1, j - 1]
   member x.Get (i : int) (j : int) = x.m.[i - 1, j - 1]
   member x.Set (i : int) (j : int) (v : float) = x.m.[i - 1, j - 1] <- v
   member x.Rows
       with get () = x.m.GetLength(0)
   member x.Cols
       with get () = x.m.GetLength(1)
   member x.T () : Matrix =
       let ret = new Matrix(x.Cols, x.Rows)
       for i = 0 to x.Rows - 1 do
           for j = 0 to x.Cols - 1 do
               ret.m.[j, i] <- x.m.[i, j]
       ret
   static member Identity (n : int) : Matrix =
       let ret = new Matrix(n, n)
       for i = 0 to n - 1 do
           ret.m.[i, i] <- 1.0
       ret
   static member (+) (x : Matrix, y : Matrix) : Matrix =
       if x.Rows <> y.Rows || x.Cols <> y.Cols then raise (new Exception())
       let ret = new Matrix(x.Rows, x.Cols)
       for i = 0 to ret.Rows - 1 do
           for j = 0 to ret.Cols - 1 do
               ret.m.[i, j] <- x.m.[i, j] + y.m.[i, j]
       ret
   static member (-) (x : Matrix, y : Matrix) : Matrix =
       if x.Rows <> y.Rows || x.Cols <> y.Cols then raise (new Exception())
       let ret = new Matrix(x.Rows, x.Cols)
       for i = 0 to ret.Rows - 1 do
           for j = 0 to ret.Cols - 1 do
               ret.m.[i, j] <- x.m.[i, j] - y.m.[i, j]
       ret
   static member (*) (k : float, x : Matrix) : Matrix =
       let ret = new Matrix(x.Rows, x.Cols)
       for i = 0 to ret.Rows - 1 do
           for j = 0 to ret.Cols - 1 do
               ret.m.[i, j] <- k * x.m.[i, j]
       ret
   static member (*) (x : Matrix, k : float) : Matrix = k * x
   static member (/) (x : Matrix, k : float) : Matrix = (1.0 / k) * x
   static member (*) (x : Matrix, y : Matrix) : Matrix =
       if x.Cols <> y.Rows then raise (new Exception())
       let M = x.Rows
       let S = x.Cols
       let N = y.Cols
       let ret = new Matrix(M, N)
       for i = 0 to M - 1 do
           for j = 0 to N - 1 do
               for k = 0 to S - 1 do
                   ret.m.[i, j] <- ret.m.[i, j] + x.m.[i, k] * y.m.[k, j]
       ret
   static member Dot (x : Matrix) (y : Matrix) : float =
       if (x.Rows <> 1 && x.Cols <> 1) || (y.Rows <> 1 && y.Cols <> 1) then raise (new Exception())
       let mutable ret : float = 0.0
       if x.Rows = 1 then
           if y.Rows = 1 then
               if x.Cols <> y.Cols then raise (new Exception())
               for i = 0 to x.Cols - 1 do ret <- ret + x.m.[0, i] * y.m.[0, i]
           else // y.Cols = 1
               if x.Cols <> y.Rows then raise (new Exception())
               for i = 0 to x.Cols - 1 do ret <- ret + x.m.[0, i] * y.m.[i, 0]
       else // x.Cols = 1
           if y.Rows = 1 then
               if x.Rows <> y.Cols then raise (new Exception())
               for i = 0 to x.Rows - 1 do ret <- ret + x.m.[i, 0] * y.m.[0, i]
           else // y.Cols = 1
               if x.Rows <> y.Rows then raise (new Exception())
               for i = 0 to x.Rows - 1 do ret <- ret + x.m.[i, 0] * y.m.[i, 0]
       ret
   member x.Norm () : float = sqrt(Matrix.Dot x x)
   member x.Normalize () : Matrix = x / x.Norm()
   member x.Each (f : float -> float) : Matrix =
       let ret = new Matrix(x.Rows, x.Cols)
       for i = 0 to x.Rows - 1 do
           for j = 0 to x.Cols - 1 do
               ret.m.[i, j] <- f x.m.[i, j]
       ret
end
2   関東の国王      2020年2月29日 土 22:57
up
3   関東の国王      2020年7月17日 金 14:32
up
ヒント: 海・梅
名前      編集用パスワード(省略可)    パスワードの記憶
数式 αβγ IPA http:// 画像 B I U
(添付ファイルは http://up.x0000.net/ にアップロードしてください)