矩阵分解 三角分解(LU分解) - billbliss的专栏 - CSDN博客 https://blog.csdn.net/billbliss/article/details/78559289
矩阵的三角分解其基本原理可见上面的博客链接(写的很好,此处不再赘述)。
本博客主要是给出三角分解的C语言实现过程。
这里举出的计算实例如下所示:
2. 我们采用的第二种方法是直接将L中的元素和U中的元素写入到Arr矩阵中去.
/*接下来我们来创建一个方法,来计算生成新的Arr数组*/ void Triangle_decomp01(double (*Arr)[3], int N){ // 本方法是为了实现将系数矩阵中的具体内容写入到原系数矩阵中去 // 首先第一行不去变化,因为原L中的对角线上元素将不再出现 // 接下来处理第一列,对于第一列元素, for(int i=1; i<N; i++) Arr[i][0] /= Arr[0][0]; double sum_val = 0.0; // 接下来该是先去处理行上的元素,然后再去处理列上的元素 for(int i=1; i<N; i++){ // 接下来首先需要进行列上元素的遍历,对于列上元素的起始索引,应该是当前的行数 for(int col_i=i; col_i=0; d--){ sum_val += Arr[i][d] * Arr[d][col_i]; } // 接下来来计算对应的U上的元素 // 对于U上对应位置上的元素,我们只需要将原索引上的值减去sum_val即可 Arr[i][col_i] -= sum_val; } // 接下来我们需要做的便是来处理L的列上的元素 // 当我们来遍历列上的元素时,对应的i将会转为遍历的列上 for(int row_i=i+1; row_i=0; col_i--){ // 这里遍历的col_i 是在L中对应的列 sum_val += Arr[row_i][col_i] * Arr[col_i][i]; } Arr[row_i][i] = (Arr[row_i][i]-sum_val) / Arr[i][i]; } } }
运算结果见下图:
3. 我们采用的第三种方式是,将系数矩阵写为1D,并将L中的数据和U中的数据覆盖到原Arr中去。
/*接下来创建一个方法,该方法将采用1D的系数矩阵来进行方程组的求解*/ void Triangle_decomp02(double *Arr, int N){ // 第一行中的所有元素将不会再改变, // 我们要做的是先来处理第一列上的元素 for(int i=1; i<N; i++){ // 这里的遍历是第一列上的索引 Arr[i*N+0] = Arr[i*N+0] / Arr[0]; } // 接下来我们要做的便是该去进行后续的行的数据操作了 // 首先遍历的是当前要处理的行 double sum_val = 0.0; for(int i=1; i<N; i++){ // 内部的循环应该首先是列,因为已经制定了要处理的行 // 接下来需要首先指定我们要处理的列 for(int col_i=i; col_i=0; d--){ // 内部的求和,必须是所操作行上面的所有行 // sum_val += Arr[i][d]*Arr[d][col_i]; sum_val += Arr[i*N+d] * Arr[d*N+col_i]; } // Arr[i][col_i] -= sum_val; Arr[i*N+col_i] -= sum_val; } // 接下来我们该来处理L中对应的列上的元素了 // 此处i将自动转为L中的列索引 // 那么下面我们首先应该去进行行的遍历了 for(int row_i=i+1; row_i=0; col_i--){ // sum_val += Arr[row_i][col_i] * Arr[col_i][i]; sum_val += Arr[row_i*N+col_i] * Arr[col_i*N+i]; } // Arr[row_i][i] = (Arr[row_i][i] - sum_val) / Arr[i][i]; Arr[row_i*N+i] = (Arr[row_i*N+i] - sum_val) / Arr[i*N+i]; } } }
运算结果见下图:
程序有什么问题,请留言,相互讨论共同进步。千万不要停下学习的脚步,社会竞争压力很大。从学校出来以后,感觉钱真是太难挣了,尤其房价高的吓人。估计等我攒够买房子的钱的时候,我已经250岁了。
龙猪是个贫苦大户,当前支持以下扶贫方式。
作者:LongZhu8