丁致宇第五周学习报告
[TOC]
矩阵的知识
矩阵与向量相乘
矩阵与向量的乘法是线性代数中的基本操作之一,它遵循特定的规则。在数学中,一个矩阵可以被看作是一个线性变换,而向量则可以被看作是空间中的一个点或者箭头。当我们将一个矩阵与一个向量相乘时,我们实际上是在将这个线性变换应用到这个向量上。
矩阵与向量乘法的规则
假设有一个 m×n 的矩阵 A 和一个 n 维的列向量 x,它们的乘积是一个 m 维的列向量 y。这个乘积定义为:
Ax=y
其中 A 是这样一个矩阵:
A=a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn
x 是这样一个向量:
x=x1x2⋮xn
那么乘积 y 的每个元素 yi(i 从 1 到 m)可以通过下面的方式计算:
yi=ai1x1+ai2x2+⋯+ainxn
或者更紧凑的表示为:
yi=j=1∑naijxj
例子
假设我们有一个 2×3 的矩阵 A 和一个 3 维的列向量 x:
A=[2−10314],x=351
那么它们的乘积 y 将是:
y=Ax=[2−10314]351=[(2⋅3)+(0⋅5)+(1⋅1)(−1⋅3)+(3⋅5)+(4⋅1)]=[714]
这里我们分别计算了 y1 和 y2 的值:
- 对于 y1,我们计算了 2⋅3+0⋅5+1⋅1=7
- 对于 y2,我们计算了 −1⋅3+3⋅5+4⋅1=14
注意事项
- 矩阵 A 的列数必须与向量 x 的行数相等。
- 结果 y 的维数将与矩阵 A 的行数相同。
- 矩阵与向量的乘法不是交换的,即 Ax=xA。
- 矩阵与向量的乘法是分配的和结合的,即 A(x+y)=Ax+Ay,且 (AB)x=A(Bx),其中 A 和 B 是矩阵,x 和 y 是向量。
矩阵与向量的乘法在许多领域都非常重要,包括计算机图形学、工程、物理学、统计学以及机器学习和数据科学等。
矩阵乘法
就是前面的矩阵的行乘以后面矩阵的列,每一行都与每一列相乘
结果的行数由前面矩阵决定,结果所在的列数由后面的矩阵决定
矩阵乘法是线性代数中的一个核心概念,用于结合两个矩阵的信息。假设我们有两个矩阵 A 和 B,它们的乘积是第三个矩阵 C。矩阵乘法的定义如下:
- 矩阵 A 的大小为 m×n,即它有 m 行和 n 列。
- 矩阵 B 的大小为 n×p,即它有 n 行和 p 列。
- 为了能够进行乘法,矩阵 A 的列数必须等于矩阵 B 的行数。
如果上述条件满足,那么矩阵 A 和矩阵 B 的乘积是一个 m×p 的矩阵 C。矩阵 C 中的每个元素 cij 是通过将矩阵 A 的第 i 行与矩阵 B 的第 j 列对应元素相乘然后求和得到的:
cij=ai1b1j+ai2b2j+⋯+ainbnj=k=1∑naikbkj
其中 i=1,2,…,m 和 j=1,2,…,p。
例子
让我们通过一个具体的例子来说明矩阵乘法是如何进行的:
假设我们有如下两个矩阵 A 和 B:
A=[2−103],B=[124−1]
矩阵 A 是一个 2×2 的矩阵,矩阵 B 也是一个 2×2 的矩阵。它们的乘积 C 将是:
C=AB=[(2⋅1+0⋅2)(−1⋅1+3⋅2)(2⋅4+0⋅−1)(−1⋅4+3⋅−1)]=[258−7]
这里,C 的每个元素是通过以下计算得到的:
- c11=(2⋅1)+(0⋅2)=2
- c12=(2⋅4)+(0⋅−1)=8
- c21=(−1⋅1)+(3⋅2)=5
- c22=(−1⋅4)+(3⋅−1)=−7
注意事项
- 矩阵乘法不是交换的,即 AB=BA 一般来说。
- 矩阵乘法是结合的,即 (AB)C=A(BC)。
- 矩阵乘法是分配的,即 A(B+C)=AB+AC。
- 矩阵乘法通常包含大量的乘法和加法操作,因此计算上可能相当耗时,特别是对于大型矩阵。
矩阵乘法在数据处理、物理科学、工程、计算机图形学以及经济学等许多领域都有广泛的应用。
现在,我们用C语言来实现矩阵乘法。以下是一个简单的程序,它实现了两个矩阵的乘法:
#include <stdio.h>
#define MAX_SIZE 100
void matrixMultiply(int m, int n, int p, int A[][MAX_SIZE], int B[][MAX_SIZE], int C[][MAX_SIZE]) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < p; j++) {
C[i][j] = 0;
for (int k = 0; k < n; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
int main() {
int m, n, p;
int A[MAX_SIZE][MAX_SIZE], B[MAX_SIZE][MAX_SIZE], C[MAX_SIZE][MAX_SIZE];
printf("Enter rows and columns for matrix A: ");
scanf("%d %d", &m, &n);
printf("Enter elements of matrix A:\n");
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
scanf("%d", &A[i][j]);
printf("Enter rows and columns for matrix B: ");
scanf("%d %d", &n, &p);
printf("Enter elements of matrix B:\n");
for (int i = 0; i < n; i++)
for (int j = 0; j < p; j++)
scanf("%d", &B[i][j]);
matrixMultiply(m, n, p, A, B, C);
printf("Result of matrix multiplication:\n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < p; j++)
printf("%d ", C[i][j]);
printf("\n");
}
return 0;
}
这个程序首先定义了一个matrixMultiply
函数,它接受两个矩阵的尺寸和元素,然后计算它们的乘积。main
函数用于获取用户输入的矩阵尺寸和元素,并调用matrixMultiply
函数来计算乘积,最后打印结果矩阵。
请注意,这个程序假设用户会输入有效的矩阵尺寸,其中矩阵A的列数等于矩阵B的行数,且所有矩阵的尺寸都不超过MAX_SIZE
定义的大小。在实际应用中,你可能需要添加额外的错误检查来确保输入的有效性。
实践:用MPI并行化矩阵乘运算