Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 矩阵乘法:向量到矩阵的转换_C#_Winforms_Vector_Matrix Multiplication_Math.net - Fatal编程技术网

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)中。使用这种方法,我可以用

我刚刚开始学习Math.NET数字,发现它对于矩阵乘法非常有用和强大。这对我来说是一个很大的挑战,因为我刚刚开始学习C#,我希望我能在这里找到一些解决方案来帮助我完成整个旅程。提前谢谢你

目标:

  • 从第一列和第二列中填写的Excel文件中提取数据,并将其放入nx2矩阵中(其中n可以是任意数量的行,这里我设置为3000,因此它是3000x2矩阵)

  • 从矩阵的第一列提取数据乘以5,并存储在向量1(VColumn)中。类似地,从矩阵的第二列提取数据乘以2并存储在向量2(VRow)中。使用这种方法,我可以用不同的值乘以每一列。(是否有其他更直接的方法使用.multiply关键字以矩阵形式单独乘以每个列的值?)

  • 将向量1和向量2放入矩阵形式(3000x2矩阵格式)。但是我得到的输出是0。但我不确定这是正确的方法。。。我如何为这个部分或任何其他替代方案编码
  • 我不确定这是否是为矩阵乘法编码的正确方法。如果有其他方法,请分享,因为我还在学习。非常感谢

    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的版本,谢谢分享!