线性代数 --- 矩阵与向量的乘法和矩阵与矩阵的乘法

矩阵与向量相乘

part I 矩阵与向量的乘法:

矩阵x列向量(注:可以把列向量看成是nx1的矩阵)

        现有如下方程组: 

9个系数,3个未知数,等式右边有3个数

        上述方程组可用矩阵的方式改写成,一个系数矩阵A与一个未知数向量x的乘积,乘积的结果等于右端向量b:


现在我们分别用两种方法,逐行点乘各列的线性组合来计算系数矩阵A未知数向量x的乘法。

第一种方法,逐行点乘

用A矩阵中的每一行row去乘以x,如下

        用这种计算方法得到的结果,正好是原始方程组中的第一个方程的左边。依此类推,也就是用A矩阵中的第二,第三行,逐一与向量x相乘,就能得到整个原始方程组的左边。

 \begin{bmatrix} 2 &1 &1 \\ 4&-6 &0 \\ -2&7 &2 \end{bmatrix} \begin{bmatrix} u \\v \\w \end{bmatrix} = \begin{bmatrix} 2u+v+w\\ 4u-6v\\ -2u+7v+2w \end{bmatrix}

补充图示: 

Tips:(点乘/内积) 

        一个1xn的行向量乘以一个nx1的列向量是一个非常基本的操作,他会得到一个数1x1。这个算法又叫矩阵的内积(Inner product)或点乘。例如,用A中的第一行[2 1 1]乘以另外一个列向量[1 1 2],得到的就是一个数[5]。


第二种方法,各列的线性组合

        把b看成是A中各个列向量(column)与未知数向量x的线性组合,其中,u,v,w分别代表了矩阵A中第1,2,3列所对应的权重。

u\begin{bmatrix} 2 \\ 4 \\-2 \end{bmatrix}+v\begin{bmatrix} 1 \\ -6 \\7 \end{bmatrix}+w\begin{bmatrix} 1 \\ 0 \\2 \end{bmatrix}=\begin{bmatrix} 2u \\ 4u \\-2u \end{bmatrix}+\begin{bmatrix} v \\ -6v \\7v \end{bmatrix}+\begin{bmatrix} w \\ 0 \\2w \end{bmatrix}\\ = \begin{bmatrix} 2u+v+w\\ 4u-6v\\ -2u+7v+2w \end{bmatrix}

        这种计算方法与思考方式应当成为首选,更是学习线性代数该有的视角(强烈推荐)。因为他是在用线性组合的方式来看问题。(在后面的学习中,我们会用空间Space这种更高的视角来看Ax=b。)就好像我在另外一篇自己的学习总结中写的那样,学习线性代数的重点,不应该是只学习如果求解Ax=b,而是去学习如果表达Ax=b。 

补充图示:


 行向量x矩阵(注:可以把行向量看成是1xn的矩阵)

 

        同理,对于另一种向量,行向量而言,也有相似的两种算法。所不同的是,列向量的乘法矩阵在向量之前,而行向量的乘法,矩阵在向量之后。

1,逐列点乘

 


2,各行的线性组合

 


矩阵与矩阵相乘

part II 矩阵与矩阵的乘法:

        有了前面的基础知识,我们就应该摈弃早年学习线性代数时早已形成的那种,用矩阵A中的每一行乘x的方式去计算Ax中的每一个元素。而是应该尝试着去考虑上文中提到的线性组合视角。矩阵与矩阵相乘分为矩阵的左(前)乘矩阵的右(后)乘矩阵的右(后)乘即为对矩阵A的列操作,而矩阵的左(前)乘即为对矩阵A的行操作

矩阵的右(后)乘:矩阵B右乘矩阵A,AB

假设矩阵A的维度是axb,矩阵B的维度是bxc

        矩阵B后(右)乘矩阵A。首先,把矩阵B看成一个个列向量col_{1},col_{2}......col_{c},共计c列,其中每个列向量都有b个元素。其次,把这些列向量中的元素看成对A中各列线性组合的权重,即,col_{1}=W_{1},col_{2}=W_{2},...,col_{c}=W_{c},每个W都有b个子权重

        B中每个col与矩阵A各列的计算结果都是一个ax1的列向量,作为新矩阵AB的一列。因为矩阵B有c个col,因此要计算c次,得到c个ax1的列向量矩阵AB最终是一个axc的矩阵

(牢记口诀:后乘矩阵,列操作。)


矩阵的左(前)乘:矩阵B左乘矩阵A,BA

假设矩阵A的维度是nxj,矩阵B的维度是ixn

        矩阵B左乘矩阵A。首先,把矩阵B看成一个个行向量row_{1},row_{2},...row_{i},共计i行,其中每个行向量都有n个元素。其次,把这些行向量中的元素看做对A中各行线性组合的权重,即,row_{1}=W_{1},row_{2}=W_{2},...,row_{i}=W_{i},每个W都有c个子权重

        B中每个row与矩阵A各行的计算结果都是一个1xj的行向量,作为新矩阵AB的一行。因为矩阵B有i个row,因此要计算i次,得到i个1xj的行向量矩阵BA最终是一个ixj的矩阵

(牢记口诀:前乘矩阵,行操作。)


 (全文完) 

---作者,松下J27

参考文献(鸣谢):

        1,Linear Algebra and Its Applications, Forth edition ---  Gibert Strang(page 21)

        2,线性代数及其应用 --- 侯自新,南开大学出版社,1990年

        3,The-Art-of-Linear-Algebra/The-Art-of-Linear-Algebra-zh-CN.pdf at main · kenjihiranabe/The-Art-of-Linear-Algebra · GitHub

格言摘抄:

        「她許多的罪都赦免了,因為她的愛多;但那赦免少的,他的愛就少。」---出自圣经,路加福音7章47節

本文于2023年6月24日做了修改与更新,望大家喜欢。

修改了部分措辞,增添了插图。2024/07/13

(配图与本文无关) 

版权声明:所有的笔记,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27

  • 21
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
好的,下面是一个简单的 MPI 矩阵-向量乘法的代码实现,假设矩阵向量的元素都是整数类型: ```c #include <stdio.h> #include <mpi.h> #define N 4 int main(int argc, char** argv) { int numprocs, rank, i, j; int A[N][N], x[N], y[N], recvA[N], recvy[N]; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0) { // 从标准输入中读入矩阵向量 printf("请输入矩阵 A:\n"); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { scanf("%d", &A[i][j]); } } printf("请输入向量 x:\n"); for (i = 0; i < N; i++) { scanf("%d", &x[i]); } } // 把矩阵向量广播到每个进程 MPI_Bcast(A, N*N, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(x, N, MPI_INT, 0, MPI_COMM_WORLD); // 计算每个进程需要计算的部分 int num_rows = N / numprocs; int start_row = rank * num_rows; int end_row = start_row + num_rows; for (i = start_row; i < end_row; i++) { y[i] = 0; for (j = 0; j < N; j++) { y[i] += A[i][j] * x[j]; } } // 把每个进程计算得到的部分收集到主进程 MPI_Gather(y+start_row, num_rows, MPI_INT, recvy, num_rows, MPI_INT, 0, MPI_COMM_WORLD); if (rank == 0) { // 把收集到的结果输出到标准输出 printf("计算结果为:"); for (i = 0; i < N; i++) { printf("%d ", recvy[i]); } printf("\n"); } MPI_Finalize(); return 0; } ``` 该代码中,每个进程都会计算部分结果,然后把部分结果收集到主进程,最后输出整个向量的结果。在这个例子中,矩阵向量都是在主进程中读入的,然后广播到每个进程。如果你想从其他地方读入矩阵向量,可以修改代码中的读入部分。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

松下J27

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值