C# MathNet

  • `Vector`
    • 使用 `Build.Dense` 创建列向量:
    • 列向量转行向量(行矩阵):
    • 使用 `DenseOfArray` 方法:
    • 使用 `PointwiseMultiply` 进行向量元素级乘法:
    • 计算向量的点积(内积):
    • 访问向量的特定元素:
    • 遍历向量中的所有元素:
    • 输出向量:
  • `Matrix`
    • 创建矩阵:
    • 矩阵属性访问:
    • 矩阵元素访问和赋值:
    • 矩阵运算:
    • 矩阵分解和求解:
    • 读写矩阵:
    • 矩阵的转置:
    • 逐点乘法 `PointwiseMultiply`
    • `SetColumn`
    • `TransposeThisAndMultiply` `D'*D`
    • `Inverse` D^(-1)
    • 矩阵的打印和字符串表示:

Vector

MathNet.Numerics 中,Vector<T> 是表示向量的类。Vector<T> 可以是列向量或行向量,具体取决于你如何创建它以及如何使用它。以下是一些创建和使用 Vector<T> 的常见方法:

使用 Build.Dense 创建列向量:

var vector = 
	Vector<double>.Build.Dense(new double[] {1, 2, 3});

列向量转行向量(行矩阵):

var b = Vector<double>.Build.Dense(5, 0);
Matrix<double> rowVector = b.ToRowMatrix();

使用 DenseOfArray 方法:

 var vectorFromArray = 
 	Vector<double>.Build.DenseOfArray(
 		new double[] { 1, 2, 3 }
 	);

使用 PointwiseMultiply 进行向量元素级乘法:

var vector1 = 
	Vector<double>.Build.Dense(
		new double[] {1, 2, 3}
	);
var vector2 = 
	Vector<double>.Build.Dense(
		new double[] {4, 5, 6}
	);
	
var product = vector1.PointwiseMultiply(vector2);
Console.WriteLine(product);
DenseVector 3-Double
 4
10
18

计算向量的点积(内积):

var vector1 = 
	Vector<double>.Build.Dense(
		new double[] { 1, 2, 3 }
	);
var vector2 = 
	Vector<double>.Build.Dense(
		new double[] { 4, 5, 6 }
	);
	
var dotProduct = vector1.DotProduct(vector2);
Console.WriteLine(dotProduct);
32

获取向量的转置(对于列向量,转置将返回行向量,反之亦然):

// 创建一个列向量
var vector = 
	Matrix<double>.Build.DenseOfArray(
		new double[,] { { 1}, { 2}, { 3} }
	);
// 获取列向量的转置,即行向量
var transposedVector = vector.Transpose();
Console.WriteLine(transposedVector);
DenseMatrix 1x3-Double
1  2  3

访问向量的特定元素:

var vector3 = 
	Vector<double>.Build.Dense(
		new double[] { 1, 2, 3 }
	);
double firstElement = vector3[0];

Console.WriteLine(firstElement);设置向量的特定元素:
1

遍历向量中的所有元素:

var vector3 = 
	Vector<double>.Build.Dense(
		new double[] { 1, 2, 3 }
	);
foreach (var element in vector3) {
	Console.WriteLine(element);
}
1
2
3

输出向量:

var vector3 = 
	Vector<double>.Build.Dense(
		new double[] { 1, 2, 3 }
	);

Console.WriteLine(vector3);
DenseVector 3-Double
1
2
3

Matrix

C# 中,使用 MathNet.Numerics 库来处理矩阵是一个高效且功能丰富的选择。以下是一些关于如何在 C# 中使用 MathNet.Numerics 库创建和操作矩阵的基本步骤:

创建矩阵:

using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double;

using System;

namespace forCode20192 {
    class Program {
        static void Main(string[] args) {
            var D = Matrix<double>.Build.Dense(2, 9, 1);

            Console.WriteLine(D);

            Console.ReadKey();
        }
    }
}
DenseMatrix 2x9-Double
1  1  1  1  1  1  1  1  1
1  1  1  1  1  1  1  1  1


矩阵属性访问:

可以访问矩阵的行数和列数。

int rowCount = matrix.RowCount;
int columnCount = matrix.ColumnCount;

矩阵元素访问和赋值:

可以通过索引访问和修改矩阵中的元素。

double element = matrix[0, 1]; // 获取第 1 行第 2 列的元素
matrix[0, 1] = 10; // 设置第 1 行第 2 列的元素为 10

矩阵运算:

MathNet.Numerics 提供了矩阵加法、减法、数乘、矩阵乘法等基本矩阵运算。

var a = Matrix<double>.Build.Dense(2, 2, 2);
a[1, 1] = 0;
var b = Matrix<double>.Build.DenseOfArray(
	new double[,] { {1, 0}, {0, 1} }
);
	
Console.WriteLine(a*b);
DenseMatrix 2x2-Double
2  2
2  0

矩阵分解和求解:

MathNet.Numerics 支持多种矩阵分解方法,如 LU 分解、QR 分解等,并可以用来求解线性方程组。

var lu = matrix.LU();
var solution = lu.Solve(vector); // 假设 vector 是已知的向量

读写矩阵:

MathNet.Numerics 支持从文件中读取矩阵,或将矩阵保存到文件,支持的格式包括 CSVMAT 等。

var matrixFromFile = Matrix<double>.Read(
	"path/to/matrix.csv", hasHeaders: true
);
matrix.Write("path/to/matrix.csv", DelimitedWriter.Write);

矩阵的转置:

可以使用 Transpose 方法获取矩阵的转置。

var transposedMatrix = matrix.Transpose();

逐点乘法 PointwiseMultiply

MathNet.Numerics 中,PointwiseMultiply 方法用于对两个向量进行逐点乘法(也称为元素乘法或哈达玛乘法)。逐点乘法是指将两个向量的对应元素相乘,生成一个新的向量,其中新向量的每个元素都是原始向量对应元素的乘积。

Vector<double> vectorA = Vector<double>.Build.Dense(
	new double[] { 1.0, 2.0, 3.0 }
);
Vector<double> vectorB = Vector<double>.Build.Dense(
	new double[] { 4.0, 5.0, 6.0 }
);

// 执行逐点乘法
Vector<double> result = vectorA.PointwiseMultiply(vectorB);

// 输出结果向量
Console.WriteLine(result);
DenseVector 3-Double
 4
10
18

SetColumn

MathNet.Numerics 中,SetColumn 方法用于设置矩阵中的一个列向量。这个方法属于 Matrix<T> 类,其中 T 可以是 doublecomplex 或其他数值类型。通过 SetColumn 方法,你可以将一个向量(作为参数传递)设置为矩阵的指定列。

// 创建一个 3x3 的矩阵
Matrix<double> matrix = Matrix<double>.Build.Dense(3, 3);

// 创建一个列向量
Vector<double> columnVector = Vector<double>.Build.Dense(
	new double[] { 1.0, 2.0, 3.0 }
);

// 将列向量设置为矩阵的第二列
matrix.SetColumn(1, columnVector);

// 输出修改后的矩阵
Console.WriteLine(matrix);
DenseMatrix 3x3-Double
0  1  0
0  2  0
0  3  0

TransposeThisAndMultiply D'*D

MathNet.Numerics 中,TransposeThisAndMultiply 方法是一个高效的运算符,用于执行矩阵的转置-乘法操作。这个方法首先转置调用它的矩阵,然后将转置后的矩阵与另一个矩阵相乘。这种方法在某些情况下比先显式转置矩阵然后进行乘法更高效,因为它可以避免创建转置矩阵的副本。

// 创建两个矩阵
Matrix<double> matrixA = Matrix<double>.Build.DenseOfArray(
	new double[,] { { 1, 2, 3 }, { 4, 5, 6 } }
);

Matrix<double> matrixB = Matrix<double>.Build.DenseOfArray(
	new double[,] { { 7, 8 }, { 9, 10 } }
);

// 使用 TransposeThisAndMultiply 方法
Matrix<double> result = matrixA.TransposeThisAndMultiply(matrixB);

// 输出结果矩阵
Console.WriteLine(result);
DenseMatrix 3x2-Double
43  48
59  66
75  84

Inverse D^(-1)

求可逆矩阵的逆

// 创建一个方阵
Matrix<double> matrix = Matrix<double>.Build.DenseOfArray(
	new double[,] { { 1, 2 }, { 3, 4 } }
);

// 计算矩阵的逆
Matrix<double> inverseMatrix = matrix.Inverse();

// 输出逆矩阵
Console.WriteLine(inverseMatrix);
DenseMatrix 2x2-Double
 -2     1
1.5  -0.5

矩阵的打印和字符串表示:

MathNet.Numerics 提供了方便的 ToString 方法,用于打印矩阵的字符串表示。

Console.WriteLine(matrix);

请注意,上述代码示例中的 matrixvectorMatrix<T>Vector<T> 类型的对象,T 通常是 doublefloatComplexComplex32 中的一种。MathNet.Numerics 是一个开源的数值计算库,专为 .NETMono 设计,提供了广泛的数值计算方法和算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/781558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浏览器插件利器-allWebPluginV2.0.0.14-stable版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…

并查集(还有反集也在)

一.定义 定义&#xff1a; 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题&#xff08;即所谓的并、查&#xff09;。比如说&#xff0c;我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。 主要构成&#xff1a; 并查集…

2-27 基于matlab的一种混凝土骨料三维随机投放模型

基于matlab的一种混凝土骨料三维随机投放模型&#xff0c;为混凝土细观力学研究提供一种快捷的三维建模源代码。可设置骨料数量&#xff0c;边界距离、骨料大小等参数。程序已调通&#xff0c;可直接运行。 2-27 matlab 混凝土骨料三维随机投放模型 - 小红书 (xiaohongshu.com)…

Redis 7.x 系列【16】持久化机制之 AOF

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 执行原理2.1 Redis 6.x2.1.1 直接写2.1.2 重写 2.2 Redis 7.x2.2.1 直接写2…

PTA甲级1005:Spell It Right

错误代码&#xff1a; #include<iostream> #include<vector> #include<unordered_map> using namespace std;int main() {unordered_map<int, string> map {{0, "zero"}, {1, "one"}, {2, "two"}, {3, "three&qu…

线程安全的原因及解决方法

什么是线程安全问题 线程安全问题指的是在多线程编程环境中&#xff0c;由于多个线程共享数据或资源&#xff0c;并且这些线程对共享数据或资源的访问和操作没有正确地同步&#xff0c;导致数据的不一致、脏读、不可重复读、幻读等问题。线程安全问题的出现&#xff0c;通常是…

【大数据综合试验区1008】揭秘企业数字化转型:大数据试验区政策数据集大公开!

今天给大家分享的是国内顶级期刊中国工业经济2023年发布的最新期刊《政策赋能、数字生态与企业数字化转型——基于国家大数据综合试验区的准自然实验》文章中所使用到的数据集——国家大数据综合试验区政策数据集以及工具变量数据&#xff0c;该文章基于2009-2019年中国上市企业…

两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码

今天推荐两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码&#xff0c;这两个源码完整&#xff0c;都是基于thinkphp内核开发的&#xff0c;框架稳定&#xff0c;带数据库&#xff0c;源码文件&#xff0c;可以直接部署使用。 第一个&#xff1a…

【数据结构与算法】快速排序挖坑法

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​

Redis源码整体结构

一 前言 Redis源码研究为什么先介绍整体结构呢?其实也很简单,作为程序员的,要想对一个项目有快速的认知,对项目整体目录结构有一个清晰认识,有助于我们更好的了解这个系统。 二 目录结构 Redis源码download到本地之后,对应结构如下: 从上面的截图可以看出,Redis源码一…

【密码学】信息安全五大属性

信息安全的五大属性&#xff0c;通常被称为CIA三元组加上两个额外的属性&#xff0c;他们是确保信息在存储、处理和传输过程中保持安全、完整和可用的关键要素。这些属性共同构成了信息安全的基础框架。 一、信息安全五大属性 我先给出一个直观的列表&#xff0c;方面大家后续…

BigDecimal(double)和BigDecimal(String)有什么区别?BigDecimal如何精确计数?

BigDecimal(double)和BigDecimal(String)的区别 double是不精确的&#xff0c;所以使用一个不精确的数字来创建BigDecimal&#xff0c;得到的数字也是不精确的。如0.1这个数字&#xff0c;double只能表示他的近似值。所以&#xff0c;当我们使用new BigDecimal(0.1)创建一个Bi…

69.WEB渗透测试-信息收集- WAF、框架组件识别(9)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;68.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;8&#xff09; 有无waf存在&am…

前端必修技能:高手进阶核心知识分享 - CSS 阴影属性详解

CSS 涉及设计到阴影的相关内容包括三个方面&#xff1a;box-shadow属性&#xff08;盒子阴影&#xff09;、 text-shadow属性&#xff08;文本阴影&#xff09;、drop-shadow滤镜。 本篇文章旨在详细介绍和分析三种阴影的具体参数设置和典型用例。 box-shadow属性&#xff08;…

蚂蚁全媒体总编刘鑫炜谈新媒体时代艺术家如何创建及提升个人品牌

新媒体时代艺术家如何创建及提升个人品牌形象——专访蚂蚁全媒体总编刘鑫炜 图为蚂蚁全媒体总编刘鑫炜 在新媒体风潮席卷全球的今天&#xff0c;传统艺术与新媒体技术的融合越来越紧密。这种变革不仅改变了艺术作品的呈现方式&#xff0c;也给艺术家们提供了更多的可能性。那么…

从FasterTransformer源码解读开始了解大模型(2.1)代码通读03

从FasterTransformer源码解读开始了解大模型&#xff08;2.2&#xff09;代码解读03-forward函数 写在前面的话 本篇的内容继续解读forward函数&#xff0c;从650行开始进行解读 零、输出Context_embeddings和context_cum_log_probs的参数和逻辑 从653行开始&#xff0c;会…

怎样让家长单独查到自己孩子的期末成绩?

期末考试的钟声已经敲响&#xff0c;随着最后一份试卷的收卷&#xff0c;学生们的紧张情绪渐渐平息。然而&#xff0c;对于老师们来说&#xff0c;这仅仅是另一个忙碌周期的开始。成绩的统计、分析、反馈&#xff0c;每一项工作都不容小觑。尤其是将成绩单一一私信给家长&#…

【Python】组合数据类型:序列,列表,元组,字典,集合

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言组合数据类型序列类型序列常见的操作符列表列表操作len()append()insert()remove()index()sort()reverse()count() 元组三种序列类型的区别 集合类型四种操作符集合setfrozens…

分子AI预测赛Task4笔记(结束)

话不多说&#xff0c;直接上官方链接&#xff1a;‌​​​‍&#xfeff;​⁠​‌​‍​​&#xfeff;​‌​⁠‬​&#xfeff;‬​​‌​​​​‬‬​​​​‍⁠‍‌​&#xfeff;⁠Task3&#xff1a;进阶baseline详解 - 飞书云文档 (feishu.cn)Task4&#xff1a;持续尝试&…