【Eigen教程】矩阵操作(三)

  • 3.1 矩阵运算

    • 向下取整

    • 向上取整

    • 四舍五入

    • 正弦

    • 余弦

    • 正切

    • 反正弦

    • 反余弦

    • 反正切

    • 双曲正弦

    • 双曲余弦

    • 双曲正切

    • 有限值检查

    • 无穷大检查

    • NaN检查

    • 最小值

    • 最大值

    • 自然对数

    • 常用对数

    • 指数

    • 平方根

    • 平方

    • 立方

    • 幂运算

    • 乘法

    • 绝对值

    • 转置

    • 共轭

    • 矩阵乘法

    • 点积

    • 叉积

    • 标量乘法

    • 标量除法

    • 加法

    • 减法

    • 3.1.1 矩阵的加减运算

    • 3.1.2 标量乘除法

    • 3.1.3 乘法、点积和叉积

    • 3.1.4 转置和共轭

    • 3.1.5 系数运算

    • 3.1.6 幂和根

    • 3.1.7 对数和指数

    • 3.1.8 两个矩阵的最小值和最大值

    • 3.1.9 矩阵相似性检查

    • 3.1.10 三角函数

    • 3.1.11 取整操作

    • 3.1.12 元素掩码

  • 3.2 矩阵约简

    • 计数大于1的元素

    • 检查所有元素是否为正

    • 检查任意元素是否为正

    • 矩阵的2范数

    • 矩阵的无穷范数

    • 乘积

    • 整个矩阵的平均值

    • 逐行/逐列的平均值

    • 所有元素的和

    • 矩阵中的最小/最大元素

    • 逐行/逐列的最小/最大元素

    • 3.2.1 最小/最大元素

    • 3.2.2 矩阵元素和

    • 3.2.3 矩阵的平均值

    • 3.2.4 矩阵的迹

    • 3.2.5 所有元素的乘积

    • 3.2.6 矩阵的范数

    • 3.2.7 矩阵元素检查

    • 3.2.8 矩阵元素计数

  • 3.3 矩阵的条件数和数值稳定性

    • 高斯消去法(行约简)

    • 行梯形形式

    • 列梯形形式

    • 全秩矩阵

    • 秩亏矩阵

    • 3.3.1 矩阵的秩

    • 3.3.2 解矩阵的方法

  • 3.4 广播机制

3.1 矩阵运算

3.1.1 矩阵的加减运算

加法
Eigen::MatrixXf matrix1, matrix2;
// 矩阵 matrix1 和 matrix2 的加法
Eigen::MatrixXf result = matrix1 + matrix2; 
// 结果矩阵 result 是 matrix1 和 matrix2 对应元素相加的结果
减法
Eigen::MatrixXf matrix1, matrix2;
// 矩阵 matrix1 和 matrix2 的减法
Eigen::MatrixXf result = matrix1 - matrix2; 
// 结果矩阵 result 是 matrix1 和 matrix2 对应元素相减的结果

3.1.2 标量乘除法

标量乘法
Eigen::MatrixXf matrix;
float scalar = 2.0f;
// 矩阵 matrix 乘以标量 scalar
Eigen::MatrixXf result = matrix * scalar; 
// 结果矩阵 result 是 matrix 的每个元素都乘以 scalar 的结果
标量除法
Eigen::MatrixXf matrix;
float scalar = 2.0f;
// 矩阵 matrix 除以标量 scalar
Eigen::MatrixXf result = matrix / scalar; 
// 结果矩阵 result 是 matrix 的每个元素都除以 scalar 的结果

3.1.3 乘法、点积和叉积

矩阵乘法
Eigen::MatrixXf matrix1, matrix2;
// 矩阵 matrix1 和 matrix2 的乘法
Eigen::MatrixXf result = matrix1 * matrix2; 
// 结果矩阵 result 是 matrix1 和 matrix2 的矩阵乘法结果
点积
Eigen::VectorXf vector1, vector2;
// 向量 vector1 和 vector2 的点积
float result = vector1.dot(vector2); 
// 结果 result 是 vector1 和 vector2 的点积
叉积
Eigen::Vector3f vector1, vector2;
// 向量 vector1 和 vector2 的叉积
Eigen::Vector3f result = vector1.cross(vector2); 
// 结果向量 result 是 vector1 和 vector2 的叉积

3.1.4 转置和共轭

转置
Eigen::MatrixXf matrix;
// 矩阵 matrix 的转置
Eigen::MatrixXf result = matrix.transpose(); 
// 结果矩阵 result 是 matrix 的转置
共轭
Eigen::MatrixXcf matrix;
// 矩阵 matrix 的共轭
Eigen::MatrixXcf result = matrix.conjugate(); 
// 结果矩阵 result 是 matrix 的共轭

3.1.5 系数运算

乘法
Eigen::MatrixXf matrix1, matrix2;
// 矩阵 matrix1 和 matrix2 的系数乘法
Eigen::MatrixXf result = matrix1.array() * matrix2.array(); 
// 结果矩阵 result 是 matrix1 和 matrix2 对应元素相乘的结果
绝对值
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数绝对值
Eigen::MatrixXf result = matrix.array().abs(); 
// 结果矩阵 result 是 matrix 的每个元素的绝对值

3.1.6 幂和根

平方根
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数平方根
Eigen::MatrixXf result = matrix.array().sqrt(); 
// 结果矩阵 result 是 matrix 的每个元素的平方根
平方
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数平方
Eigen::MatrixXf result = matrix.array().square(); 
// 结果矩阵 result 是 matrix 的每个元素的平方
立方
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数立方
Eigen::MatrixXf result = matrix.array().cube(); 
// 结果矩阵 result 是 matrix 的每个元素的立方
幂运算
Eigen::MatrixXf matrix;
float exponent = 3.0f;
// 矩阵 matrix 的系数幂运算
Eigen::MatrixXf result = matrix.array().pow(exponent); 
// 结果矩阵 result 是 matrix 的每个元素的 exponent 次幂

3.1.7 对数和指数

自然对数
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数自然对数
Eigen::MatrixXf result = matrix.array().log(); 
// 结果矩阵 result 是 matrix 的每个元素的自然对数
常用对数
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数常用对数
Eigen::MatrixXf result = matrix.array().log10(); 
// 结果矩阵 result 是 matrix 的每个元素的常用对数
指数
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数指数
Eigen::MatrixXf result = matrix.array().exp(); 
// 结果矩阵 result 是 matrix 的每个元素的指数

3.1.8 两个矩阵的最小值和最大值

最小值
Eigen::MatrixXf matrix1, matrix2;
// 矩阵 matrix1 和 matrix2 的系数最小值
Eigen::MatrixXf result = matrix1.array().min(matrix2.array()); 
// 结果矩阵 result 是 matrix1 和 matrix2 对应元素的最小值
最大值
Eigen::MatrixXf matrix1, matrix2;
// 矩阵 matrix1 和 matrix2 的系数最大值
Eigen::MatrixXf result = matrix1.array().max(matrix2.array()); 
// 结果矩阵 result 是 matrix1 和 matrix2 对应元素的最大值

3.1.9 矩阵相似性检查

有限值检查
Eigen::MatrixXf matrix;
// 检查矩阵 matrix 的每个元素是否有限
Eigen::ArrayXXf result = matrix.array().isFinite(); 
// 结果数组 result 是 matrix 的每个元素是否为有限值的布尔数组
无穷大检查
Eigen::MatrixXf matrix;
// 检查矩阵 matrix 的每个元素是否为无穷大
Eigen::ArrayXXf result = matrix.array().isInf(); 
// 结果数组 result 是 matrix 的每个元素是否为无穷大的布尔数组
NaN检查
Eigen::MatrixXf matrix;
// 检查矩阵 matrix 的每个元素是否为 NaN
Eigen::ArrayXXf result = matrix.array().isNaN(); 
// 结果数组 result 是 matrix 的每个元素是否为 NaN 的布尔数组

3.1.10 三角函数

正弦
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数正弦
Eigen::MatrixXf result = matrix.array().sin(); 
// 结果矩阵 result 是 matrix 的每个元素的正弦值
余弦
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数余弦
Eigen::MatrixXf result = matrix.array().cos(); 
// 结果矩阵 result 是 matrix 的每个元素的余弦值
正切
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数正切
Eigen::MatrixXf result = matrix.array().tan(); 
// 结果矩阵 result 是 matrix 的每个元素的正切值
反正弦
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数反正弦
Eigen::MatrixXf result = matrix.array().asin(); 
// 结果矩阵 result 是 matrix 的每个元素的反正弦值
反余弦
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数反余弦
Eigen::MatrixXf result = matrix.array().acos(); 
// 结果矩阵 result 是 matrix 的每个元素的反余弦值
反正切
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数反正切
Eigen::MatrixXf result = matrix.array().atan(); 
// 结果矩阵 result 是 matrix 的每个元素的反正切值
双曲正弦
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数双曲正弦
Eigen::MatrixXf result = matrix.array().sinh(); 
// 结果矩阵 result 是 matrix 的每个元素的双曲正弦值
双曲余弦
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数双曲余弦
Eigen::MatrixXf result = matrix.array().cosh(); 
// 结果矩阵 result 是 matrix 的每个元素的双曲余弦值
双曲正切
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数双曲正切
Eigen::MatrixXf result = matrix.array().tanh(); 
// 结果矩阵 result 是 matrix 的每个元素的双曲正切值

3.1.11 取整操作

向下取整
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数向下取整
Eigen::MatrixXf result = matrix.array().floor(); 
// 结果矩阵 result 是 matrix 的每个元素向下取整后的值
向上取整
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数向上取整
Eigen::MatrixXf result = matrix.array().ceil(); 
// 结果矩阵 result 是 matrix 的每个元素向上取整后的值
四舍五入
Eigen::MatrixXf matrix;
// 矩阵 matrix 的系数四舍五入
Eigen::MatrixXf result = matrix.array().round(); 
// 结果矩阵 result 是 matrix 的每个元素四舍五入后的值

3.1.12 元素掩码

以下示例展示了如何使用 P 或 Q 矩阵中的元素替换矩阵中的元素。如果矩阵中的值小于某个阈值,我们用 P 中的元素替换它,否则用 Q 中的元素替换。

int cols, rows;
cols =2;
rows =3;
// 创建随机矩阵 R
Eigen::MatrixXf R = Eigen::MatrixXf::Random(rows, cols);

// 创建零矩阵 Q
Eigen::MatrixXf Q = Eigen::MatrixXf::Zero(rows, cols);

// 创建全为 1.0 的矩阵 P
Eigen::MatrixXf P = Eigen::MatrixXf::Constant(rows, cols,1.0);

double threshold =0.5;
// 应用掩码操作,根据阈值选择元素
Eigen::MatrixXf masked =(R.array()< threshold).select(P, Q);
// 如果 R 的元素小于阈值 threshold,则选择 P 中对应的元素,否则选择 Q 中对应的元素

3.2 矩阵约简

3.2.1 最小/最大元素

矩阵中的最小/最大元素
Eigen::MatrixXf matrix;
int min_element_row_index, min_element_col_index;
// 找到矩阵 matrix 中的最小元素
float min_value = matrix.minCoeff(&min_element_row_index, &min_element_col_index); 
// min_value 是 matrix 中的最小值,min_element_row_index 和 min_element_col_index 是最小值所在的行列索引
逐行/逐列的最小/最大元素
Eigen::MatrixXf matrix;
// 找到矩阵 matrix 中逐行的最大元素
Eigen::VectorXf max_rowwise = matrix.rowwise().maxCoeff(); 
// max_rowwise 是一个向量,包含每行的最大值

3.2.2 矩阵元素和

所有元素的和
Eigen::MatrixXf matrix;
// 计算矩阵 matrix 所有元素的和
float sum = matrix.sum(); 
// sum 是 matrix 中所有元素的和

3.2.3 矩阵的平均值

整个矩阵的平均值
Eigen::MatrixXf matrix;
// 计算矩阵 matrix 的平均值
float mean = matrix.mean(); 
// mean 是 matrix 中所有元素的平均值
逐行/逐列的平均值
Eigen::MatrixXf matrix;
// 计算矩阵 matrix 中每列的平均值
Eigen::VectorXf col_mean = matrix.colwise().mean(); 
// col_mean 是一个向量,包含每列的平均值

3.2.4 矩阵的迹

Eigen::MatrixXf matrix;
// 计算矩阵 matrix 的迹
float trace = matrix.trace(); 
// trace 是 matrix 的迹,即对角线元素的和

3.2.5 所有元素的乘积

乘积
Eigen::MatrixXf matrix;
// 计算矩阵 matrix 所有元素的乘积
float prod = matrix.prod(); 
// prod 是 matrix 中所有元素的乘积

3.2.6 矩阵的范数

矩阵的2范数
Eigen::MatrixXf matrix;
// 计算矩阵 matrix 的2范数
float norm2 = matrix.lpNorm<2>(); 
// norm2 是 matrix 的2范数
矩阵的无穷范数
Eigen::MatrixXf matrix;
// 计算矩阵 matrix 的无穷范数
float norm_inf = matrix.lpNorm(); 
// norm_inf 是 matrix 的无穷范数

3.2.7 矩阵元素检查

检查所有元素是否为正
Eigen::MatrixXf matrix;
// 检查矩阵 matrix 所有元素是否为正
bool all_positive = (matrix.array() > 0).all(); 
// all_positive 为 true 表示 matrix 所有元素都为正
检查任意元素是否为正
Eigen::MatrixXf matrix;
// 检查矩阵 matrix 任意元素是否为正
bool any_positive = (matrix.array() > 0).any(); 
// any_positive 为 true 表示 matrix 中存在至少一个正元素

3.2.8 矩阵元素计数

计数大于1的元素
Eigen::MatrixXf matrix;
// 计数矩阵 matrix 中大于 1 的元素
int count = (matrix.array() > 1).count(); 
// count 是 matrix 中大于 1 的元素数量

3.3 矩阵的条件数和数值稳定性

3.3.1 矩阵的秩

矩阵的列秩是该矩阵中线性无关列的最大数量。列秩与行秩相等,这一点可以通过证明。一个矩阵的秩等于其行数和列数中较小的那个数值。

全秩矩阵

如果其秩等于矩阵的最大可能秩,则称其为全秩矩阵。

秩亏矩阵

如果矩阵没有全秩,则称其为秩亏矩阵。

3.3.2 解矩阵的方法

高斯消去法(行约简)

这种方法还可以用于计算矩阵的秩、方阵的行列式和可逆矩阵的逆矩阵。

行梯形形式

指的是高斯消去法对行的操作。

列梯形形式

指的是高斯消去法对列的操作。

3.4 广播机制

矩阵的广播机制允许对不同尺寸的矩阵进行操作,将较小的矩阵扩展到与较大的矩阵相同的尺寸进行运算。

你可能感兴趣的:(矩阵,算法,线性代数)