[线性代数] (01) 矩阵的行视角和列视角
最编程
2024-04-04 22:15:41
...
线性代数的研究对象是Vector\Matrix\SubSpace。
看到一个Ax=b,怎么理解?
(1)一种理解角度是行视角。
Ax=b可以看作是一个多元线性方程组,其中每一行可以看作n维空间中的一个子空间。比如说,A是大小22, 每一行的方程就可以看作是二维平面上的一条线。两条线的交点就是x的解。同理,A大小33,每一行的方程就是三维空间中的一个平面。。。。
这个视角是最容易想到的。而且由于思维定势,看到矩阵乘vector就忍不住“左边行乘右边列”了。
(2)列视角。
将A matrix看作是列向量的组合。举个三维空间中的例子方便理解。
A=[ a0 ,a1, a2]
a0,a1,a2是列向量,代表了三维空间中的三个向量。
Ax=[a0,a1,a2][x0,x1,x2]'=x0*a0+x1*a1+x2*a2
Ax就可以看作为列向量的线性组合。
怎么知道Ax=b有没有解?
Ax中x取所有值,得到的向量形成一个空间,如果b在这个空间内,就有解。
如果A的3个列向量是线性无关的,那么Ax形成的空间就是整个三维空间,或者说,整个三维空间中的任何向量都可以用A中的列向量线性相加表示出来。
看到一个Ax=b,怎么理解?
(1)一种理解角度是行视角。
Ax=b可以看作是一个多元线性方程组,其中每一行可以看作n维空间中的一个子空间。比如说,A是大小22, 每一行的方程就可以看作是二维平面上的一条线。两条线的交点就是x的解。同理,A大小33,每一行的方程就是三维空间中的一个平面。。。。
这个视角是最容易想到的。而且由于思维定势,看到矩阵乘vector就忍不住“左边行乘右边列”了。
(2)列视角。
将A matrix看作是列向量的组合。举个三维空间中的例子方便理解。
A=[ a0 ,a1, a2]
a0,a1,a2是列向量,代表了三维空间中的三个向量。
Ax=[a0,a1,a2][x0,x1,x2]'=x0*a0+x1*a1+x2*a2
Ax就可以看作为列向量的线性组合。
怎么知道Ax=b有没有解?
Ax中x取所有值,得到的向量形成一个空间,如果b在这个空间内,就有解。
如果A的3个列向量是线性无关的,那么Ax形成的空间就是整个三维空间,或者说,整个三维空间中的任何向量都可以用A中的列向量线性相加表示出来。
上一篇: 开发人员必读计算机科学中的线性代数
下一篇: 目录线性检索法
推荐阅读
-
STM32 >> 矩阵键盘(代码风格优美,简明易懂)-key.h /** ****************************************************************************** * @file bsp_key.h * @author Waao * 版本 V1.0.0 * 日期:2018 年 12 月 20 日 * 该文件包含一些电路板支持包对 KEY 的定义。 * ****************************************************************************** * @ 注意 * * 无 * ****************************************************************************** */ #ifndef __BSP_KEY_H_ #define __BSP_KEY_H_ #include <stm32f4xx.h>; #include <bsp_systick.h>; #include <bsp_usart.h>; // 第 2 列、第 3 列、第 4 列 #define C1_PIN GPIO_Pin_2 #define C1_GPIO_PORT GPIOE #define C1_GPIO_CLK RCC_AHB1Periph_GPIOE #define C2_PIN GPIO_Pin_3 #define C2_GPIO_PORT GPIOE #define C2_GPIO_CLK RCC_AHB1Periph_GPIOA #define C3_PIN GPIO_Pin_4 #define C3_GPIO_PORT GPIOE #define C3_GPIO_CLK RCC_AHB1Periph_GPIOA #define C4_PIN GPIO_Pin_5 #define C4_GPIO_PORT GPIOE #define C4_GPIO_CLK RCC_AHB1Periph_GPIOE // 行 1、行 2、行 3 #define R1_PIN GPIO_Pin_12 #define R1_GPIO_PORT GPIOB #define R1_GPIO_CLK RCC_AHB1Periph_GPIOB #define R2_PIN GPIO_Pin_13 #define R2_GPIO_PORT GPIOB #define R2_GPIO_CLK RCC_AHB1Periph_GPIOB #define R3_PIN GPIO_Pin_14 #define R3_GPIO_PORT GPIOB #define R3_GPIO_CLK RCC_AHB1Periph_GPIOB #define R4_PIN GPIO_Pin_15 #define R4_GPIO_PORT GPIOB #define R4_GPIO_CLK RCC_AHB1Periph_GPIOB // 检测和输出 #define DETECT_C1 GPIO_ReadInputDataBit(C1_GPIO_PORT, C1_PIN) #define DETECT_C2 GPIO_ReadInputDataBit(C2_GPIO_PORT, C2_PIN) #define DETECT_C3 GPIO_ReadInputDataBit(C3_GPIO_PORT, C3_PIN) #define DETECT_C4 GPIO_ReadInputDataBit(C4_GPIO_PORT, C4_PIN) #define DETECT_R1 GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN) #define DETECT_R2 GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN) #define DETECT_R3 GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN) #define DETECT_R4 GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN) #define S1 0x77 #define S2 0xB7 #define S3 0xD7 #define S4 0xE7 #define S5 0x7B #define S6 0xBB #define S7 0xDB #define S8 0xEB #define S9 0x7D #define S10 0xBD #define S11 0xDD #define S12 0xED #define S13 0x7E #define S14 0xBE #define S15 0xDE #define S16 0xEE void GPIO_RCC_Config(void); void ROCI_GPIO_Config(void); void RICO_GPIO_Config(void); void KEY_GPIO_ConfigAndDetect(void); #endif
-
[线性代数] (01) 矩阵的行视角和列视角
-
学习笔记:线性代数 - 矩阵的四个子空间 - 行空间和列空间
-
[线性代数] (02) 消元、矩阵的行和列运算
-
Python 2D 矩阵 行和列转置的多种实现方法
-
在C语言里,如何算出3列4行和4行3列的矩阵相乘?
-
如何将一个4列3行的矩阵翻转打印(简单来说,就是交换行和列的位置)
-
《【算法导论】动态规划在矩阵链乘法中的应用》 #include
void printParentheses(int s[6][6], int i, int j); // 打印加括号的位置 void matrixOrder(int* p, int n, int m[6][6], int s[6][6]); // 计算最佳加括号的方式 int main() { int p[7] = {30, 35, 15, 5, 10, 20, 25}; // 记录6个矩阵的行和列,注意相邻矩阵的行和列是相同的 int m[6][6] = {0}; // 存储第i个矩阵到第j个矩阵的计算代价(以乘法次数来表示) int s[6][6] = {0}; // 存储第i个矩阵到第j个矩阵的最小代价时的分为两部分的位置 int n = 6; // 矩阵个数 matrixOrder(p, n, m, s); printf("最终加括号的形式为:\n"); // 输出加括号的位置 printParentheses(s, 0, 5); return 0; } /****************************************************\ 函数功能:计算最佳的加括号的方式,得到m和s矩阵 输入: 矩阵的行和列p, 初始化的m和s矩阵 输出: 无 \****************************************************/ void matrixOrder(int* p, int n, int m[6][6], int s[6][6]) { int q = 0; int j = 0; for (int i = 0; i < n; i++) m[i][i] = 0; for (int l = 2; l <= n; l++) for (int i = 0; i < n - l + 1; i++) { j = i + l - 1; m[i][j] = 1000000; for (int k = i; k < j; k++) // 在i,j中遍历每一个分割的位置 { q = m[i][k] + m[k + 1][j] + p[i] * p[k + 1] * p[j + 1]; // 计算代价 if (q < m[i][j]) { m[i][j] = q; s[i][j] = k; } } } } /****************************************************\ 函数功能:打印加括号的位置 输入: s矩阵,想要计算的矩阵链的起始和结尾位置 输出: 无 \****************************************************/ void printParentheses(int s[6][6], int i, int j) { if (i == j) printf("A%d", i); else { printf("("); printParentheses(s, i, s[i][j]); printParentheses(s, s[i][j] + 1, j); // 递归调用 printf(")"); } } -
操作Eigen矩阵的多种子集方式:行(row)、列(col)和块(block)等