C# 矩阵乘法:向量到矩阵的转换
我刚刚开始学习Math.NET数字,发现它对于矩阵乘法非常有用和强大。这对我来说是一个很大的挑战,因为我刚刚开始学习C#,我希望我能在这里找到一些解决方案来帮助我完成整个旅程。提前谢谢你 目标:C# 矩阵乘法:向量到矩阵的转换,c#,winforms,vector,matrix-multiplication,math.net,C#,Winforms,Vector,Matrix Multiplication,Math.net,我刚刚开始学习Math.NET数字,发现它对于矩阵乘法非常有用和强大。这对我来说是一个很大的挑战,因为我刚刚开始学习C#,我希望我能在这里找到一些解决方案来帮助我完成整个旅程。提前谢谢你 目标: 从第一列和第二列中填写的Excel文件中提取数据,并将其放入nx2矩阵中(其中n可以是任意数量的行,这里我设置为3000,因此它是3000x2矩阵) 从矩阵的第一列提取数据乘以5,并存储在向量1(VColumn)中。类似地,从矩阵的第二列提取数据乘以2并存储在向量2(VRow)中。使用这种方法,我可以用
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MathNet.Numerics;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.Data.Text;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Matrix<Double> fileMatrix = DelimitedReader.Read<Double>
(@"C:\Users\Student\Downloads\MatricesData.xls", false, "\t", true); //Objective 1
textBox1.AppendText(fileMatrix.ToString());
Vector<Double> x = Vector<Double>.Build.Dense(3000, 1); //Objective 2
Vector<Double> y = Vector<Double>.Build.Dense(3000, 1);
Vector<Double> VColumn = fileMatrix.Column(0);
Vector<Double> VRow = fileMatrix.Column(1);
VColumn.Multiply(5.0, x);
VRow.Multiply(1.0, y);
textBox1.AppendText(x.ToString());
textBox1.AppendText(y.ToString());
Matrix<Double> z = Matrix<Double>.Build.Dense(3000, 2); //Objective 3: Need help
z.InsertColumn(0, VColumn);
z.InsertColumn(1, VRow);
textBox1.AppendText(z.ToString());
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
使用MathNet.Numerics;
使用MathNet.Numerics.LinearAlgebra;
使用MathNet.Numerics.Data.Text;
命名空间WindowsFormsApp1
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
矩阵fileMatrix=delimiter.Read
(@“C:\Users\Student\Downloads\MatricesData.xls”,false,“\t”,true);//目标1
textBox1.AppendText(fileMatrix.ToString());
向量x=Vector.Build.Dense(3000,1);//目标2
向量y=Vector.Build.density(3000,1);
Vector VColumn=fileMatrix.Column(0);
向量VRow=fileMatrix.Column(1);
VColumn.乘法(5.0,x);
VRow.乘法(1.0,y);
textBox1.AppendText(x.ToString());
textBox1.AppendText(y.ToString());
矩阵z=Matrix.Build.Dense(3000,2);//目标3:需要帮助
z、 插入列(0,VColumn);
z、 插入列(1,VRow);
textBox1.AppendText(z.ToString());
}
}
}
InsertColumn创建一个新矩阵并插入一列:
矩阵插入列(int列索引,向量列)
创建一个新矩阵并在给定索引处插入给定列
您需要某些版本的SetColumn:
void SetColumn(int columnIndex,Vector column)
或
void SetColumn(int columnIndex、int rowIndex、int length、Vector column)
或
void SetColumn(int columnIndex,Double[]column)使用线性代数,使用矩阵*矩阵乘法可以获得相同的结果 使用
MathNet
可以
static void Main(string[] args)
{
var fileMatrix = DelimitedReader.Read<double>("data.csv",
sparse: false,
delimiter: "\t",
hasHeaders: true
);
// 5.2 1.8
// 3.2 0.2
// 1.8 2.8
// 4.4 3.4
// 5.2 0.6
// ...
var coefMatrix = CreateMatrix.DiagonalOfDiagonalArray(new double[] { 5, 2 });
var resultMatrix = fileMatrix * coefMatrix;
// 26 3.6
// 16 0.4
// 9 5.6
// 22 6.8
// 26 1.2
// 16 2.8
// ...
}
static void Main(字符串[]args)
{
var fileMatrix=delimiter.Read(“data.csv”,
稀疏:错,
分隔符:“\t”,
哈希德斯:真的
);
// 5.2 1.8
// 3.2 0.2
// 1.8 2.8
// 4.4 3.4
// 5.2 0.6
// ...
var coefMatrix=CreateMatrix.DiagonalOfDiagonalArray(新的双[]{5,2});
var resultMatrix=fileMatrix*coefMatrix;
// 26 3.6
// 16 0.4
// 9 5.6
// 22 6.8
// 26 1.2
// 16 2.8
// ...
}
您可以将n×2矩阵与2×2矩阵相乘,对角线上有5和2。这样你就不需要提取向量来操纵它们了。嗨,谢谢你的帮助!借助于图表,您的答案很容易理解,谢谢您。您好,我尝试在代码中使用Matrix InsertColumn(int columnIndex,Vector column),但它返回零,可能是我用错误的方式编写的。。。还没有尝试过SetColumn的版本,谢谢分享!