C#、数値計算、行列乗算のソース コードとデータの視覚化

私は数学で遊び、あなたはスキルで遊びますが、私はあなたほど上手ではありません、私はあなたを尊敬しています!

1. 行列乗算の基本概念

定義: 行列A ∈ R m × nB ∈ R n × pの積は、行列 C∈ R m × pです。

制限事項: 行列 A の列数は行列 B の行数と等しくなければなりません。

アルゴリズム: 行列 A の最初の行の各要素に B の最初の列を乗算し、合計して行列 C の最初の数を取得し、行列 A の最初の行に行列 B の 2 列目を乗算します。 C 行列の 2 番目の数など...

線形代数では、行列はさまざまな概念を扱う上で重要な役割を果たします。数学では、行列とは、行と列に配置された数値、記号、または式の長方形の配列または表です。行列に対して加算、減算、乗算などのさまざまな演算を実行できます。この記事では、ある行列と別の行列を乗算する方法、そのアルゴリズム、公式、2×2 および 3×3 の行列の乗算を例とともに詳しく学びます。

行列乗算の定義

行列乗算は、行列積および 2 つの行列の乗算とも呼ばれ、行列を生成します。これは二項演算です。

A と B が 2 つの行列の場合、2 つの行列 A と B の積は次のように表されます。

X=AB

したがって、2 つの行列の積は、2 つの行列間のドット積になります。

行列乗算アルゴリズム

行列乗算アルゴリズムは多くの分野に応用できるため、近年、行列乗算アルゴリズムの分野で多くの研究が行われています。アルゴリズムには次の 4 種類があります。

反復アルゴリズム

分割統治アルゴリズム

サブキュービックアルゴリズム

並列および分散アルゴリズム

これは主に C や Java などのさまざまなプログラミング言語でオンライン乗算に使用されます。最も一般的なのは、2×2、3×3、および 4×4 の行列乗算です。

演算はバイナリであり、コレクション内のエントリは加算、減算、乗算、および除算の演算を定義します。これらの演算は、実数および有理数の演算と同じです。

行列には多くの用途がありますが、本質的に行列の乗算は線形代数の演算です。線形マッピングは、行列乗算で表されるスカラー加算と乗算で構成されます。

グリッド上ではさまざまなアルゴリズムを見つけることもできます。このタイプのアルゴリズムは、2 つの異なる行列からのデータの到着に遅延が発生する可能性がある、標準的な配列アルゴリズムの固有の効率を最小限に抑えるように設計されています。

行列の乗算規則

上記で定義した式と手順から、行列乗算の次の規則とプロパティを書くことができます。

A の列数が B の行数と等しい場合、2 つの行列 A と B の積を定義します。

ABが定義されている場合、BAを定義する必要はありません

A と B が同じ次数の正方行列の場合、AB と BA は両方とも定義されます。

AB と BA の両方が定義されている場合、AB=BA は必要ありません。

2 つの行列の積がゼロ行列である場合、行列の 1 つがゼロ行列である必要はありません。

2. 行列クラスのソースコード

#define ANIMATE

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Math.Basic
{
    public partial class Matrix
    {
        /// <summary>
        /// 行数量
        /// </summary>
        public int Row { get; set; } = 0;
        /// <summary>
        /// 列数量
        /// </summary>
        public int Column { get; set; } = 0;
        /// <summary>
        /// 数据(二维数值)
        /// </summary>
        private double[,] Data { get; set; } = null;
        /// <summary>
        /// 取值this的重载
        /// </summary>
        /// <param name="y"></param>
        /// <param name="x"></param>
        /// <returns></returns>
        public double this[int row, int column]
        {
            set { Data[row, column] = value; }
            get { return Data[row, column]; }
        }
        /// <summary>
        /// 构造函数(按二维数组)
        /// </summary>
        /// <param name="d"></param>
        public Matrix(double[,] d)
        {
            Row = d.GetLength(0);
            Column = d.GetLength(1);
            Data = new double[Row, Column];
            for (int y = 0; y < Row; y++)
            {
                for (int x = 0; x < Column; x++)
                {
                    Data[y, x] = d[y, x];
                }
            }
        }
        /// <summary>
        /// 构造函数(方阵)
        /// </summary>
        /// <param name="row"></param>
        /// <param name="column"></param>
        public Matrix(int row, int column)
        {
            Row = row;
            Column = column;
            Data = new double[row, column];
        }
        /// <summary>
        /// 随机矩阵(用于演示)
        /// </summary>
        /// <param name="row"></param>
        /// <param name="column"></param>
        /// <param name="rnder"></param>
        public Matrix(int row, int column, Random rnder)
        {
            Row = row;
            Column = column;
            Data = new double[row, column];
            for (int y = 0; y < Row; y++)
            {
                for (int x = 0; x < Column; x++)
                {
                    Data[y, x] = (rnder.NextDouble() - 0.5);
                }
            }
        }
        /// <summary>
        /// 乘号的重载(乘法)
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public static Matrix operator *(Matrix a, Matrix b)
        {
            Matrix c = new Matrix(a.Row, b.Column);
            for (int y = 0; y < c.Row; y++)
            {
                for (int x = 0; x < c.Column; x++)
                {
                    c[y, x] = 0.0;
                    for (int k = 0; k < a.Column; k++)
                    {
                        c[y, x] += a[y, k] * b[k, x];
                    }
#if ANIMATE
                    // 生成演示片段
                    slides.Add(Slide(a, b, c, y, x));
#endif
                }
            }
            return c;
        }
    }
}


線形代数では、行列はさまざまな概念を扱う上で重要な役割を果たします。行列は、数学において行と列に配置された、数値、記号、または式の長方形の配列または表です。行列に対して加算、減算、乗算などのさまざまな演算を実行できます。この記事では、行列と別の行列の乗算方法、そのアルゴリズム、公式、2×2 および 3×3 の行列の乗算を例とともに詳しく学びます。

行列乗算の定義
行列乗算は、行列積および 2 つの行列の乗算とも呼ばれ、単一の行列を生成します。二項演算の一種です。 

A と B が 2 つの行列の場合、2 つの行列 A と B の積は次のように表されます。

X = AB

したがって、2 つの行列の積は 2 つの行列のドット積になります。 

行列乗算のアルゴリズム
近年、行列乗算アルゴリズムの分野では多くの分野での応用が見出され、かなりの量の研究が行われています。アルゴリズムには次の 4 種類があります。

反復アルゴリズム
分割統治アルゴリズム
サブキュービック アルゴリズム
並列分散アルゴリズム
これは主に C、Java などのさまざまなプログラミング言語でオンライン乗算に使用されます。最も一般的なのは、行列の乗算である 2×2、3×3、および 4×4 です。

この演算は、加算、減算、乗算、および除算の演算が定義されているセット内のエントリを含むバイナリです。これらの演算は、実数および有理数に対する対応する演算と同じです。

行列の応用例は数多くありますが、基本的に行列の乗算は線形代数における演算です。スカラーの加算と乗算を含む線形マッピングは、行列の乗算で表されます。

メッシュに関する幅広いアルゴリズムも見つかります。このタイプのアルゴリズムは、2 つの異なる行列からのデータの到着に遅延が発生する可能性がある、標準的な配列アルゴリズムに固有の非効率性を最小限に抑えるように設計されています。

行列乗算のルール
上記で定義した式と手順から、行列乗算の次のルールとプロパティを記述することができます。

2 つの行列 A と B の積は、A の列数が B の行数と等しい場合に定義されます。
AB が定義されている場合、BA を定義する必要はありません。
A と B が両方とも同じ次数の正方行列の場合です。の場合、AB と BA の両方が定義されます。
AB と BA の両方が定義されている場合、AB = BA である必要はありません。
2 つの行列の積がゼロ行列である場合、行列の 1 つがゼロ行列である必要はありません。

3. マトリックスアニメーション表示ソースコード

(省略、プロジェクトファイルをダウンロードしてください)。

おすすめ

転載: blog.csdn.net/beijinghorn/article/details/123888680