矩阵乘法:向量到矩阵的转换

Posted

技术标签:

【中文标题】矩阵乘法:向量到矩阵的转换【英文标题】:Matrix Multiplications: Vector to Matrix Conversion 【发布时间】:2020-01-03 10:58:09 【问题描述】:

我刚开始学习 Math.NET Numerics,发现它对矩阵乘法有用且功能强大。因为我刚开始学习 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());
        
    

【问题讨论】:

您可以将 n×2 矩阵与 2×2 矩阵相乘,其中对角线为 5 和 2。这样你就不需要提取向量来操作它们了。 【参考方案1】:

使用线性代数,您可以使用矩阵*矩阵乘法获得相同的结果

上面使用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
    // ...


【讨论】:

您好,感谢您的帮助!借助图表,您的答案很容易理解,谢谢。【参考方案2】:

InsertColumn 创建一个新矩阵并插入一列:

Matrix InsertColumn(int columnIndex, Vector column) 创建一个新矩阵并在给定索引处插入给定列。

你想要一些版本的 SetColumn:

void SetColumn(int columnIndex, Vector column) 或者 void SetColumn(int columnIndex, int rowIndex, int length, Vector column) 或者 void SetColumn(int columnIndex, Double[] column)

【讨论】:

嗨,我尝试在我的代码中使用 Matrix InsertColumn(int columnIndex, Vector column) 但它返回零,也许我以错误的方式编码它......没有尝试过 SetColumn 的版本,谢谢分享!

以上是关于矩阵乘法:向量到矩阵的转换的主要内容,如果未能解决你的问题,请参考以下文章

线性代数——矩阵乘法(续)

向量矩阵乘法、浮点向量、二进制矩阵

犰狳向量矩阵乘法

二维卷积作为矩阵-矩阵乘法[关闭]

矩阵乘法的几何意义

Matlab 矩阵乘法以及矩阵点乘的规则区别