LU分解算法(串行、并行)

2023-11-07

一、串行LU分解算法(详细见MIT线性代数)

1. LU分解

矩阵分解 LU分解
分解形式 L(下三角矩阵)、U(上三角矩阵)
目的 提高计算效率
前提 (1)矩阵A为方阵;(2)矩阵可逆(满秩矩阵);(3)消元过程中没有0主元出现,也就是消元过程中不能出现行交换的初等变换

LU分解其实就是将线性方程组:
A x = b Ax = b Ax=b
分解为:
L U x = b LUx = b LUx=b
这样一来就会有:
{ L y = b U x = y \begin{cases}Ly = b \\ Ux = y \end{cases} {Ly=bUx=y
先由下三角矩阵求解出y,再通过上三角矩阵完成对x的求解。

2. Gussian Elimination

高斯迭代求解其实就是我们在小学时候学习的二元一次方程组的解法。将一个方程中的未知数,用含有另一未知数的代数式来表示。比如:
{ x 1 − 2 x 2 + x 3 = 0 2 x 2 − 8 x 3 = 8 5 x 1 − 5 x 3 = 10 \left\{\begin{array}{l}x_{1}-2 x_{2}+x_{3}=0 \\ 2 x_{2}-8 x_{3}=8 \\ 5 x_{1}-5 x_{3}=10\end{array}\right. x12x2+x3=02x28x3=85x15x3=10
写成增广形式则有:
[ 1 − 2 1 0 0 2 − 8 8 5 0 − 5 10 ] \left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 5 & 0 & -5 & 10\end{array}\right] 1052201850810
使用高斯迭代求解,先使用式1消去式3中的 x 1 x_1 x1,则有:
[ 1 − 2 1 0 0 2 − 8 8 0 10 − 10 10 ] \left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 0 & 10 & -10 & 10\end{array}\right] 100221018100810
再使用式2消去式3中的 x 2 x_2 x2,则有:
[ 1 − 2 1 0 0 2 − 8 8 0 0 30 − 30 ] \left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 0 & 0 & 30 & -30\end{array}\right] 10022018300830
最后通过这个上三角矩阵,可以很轻松的求解出x:
{ x 1 − 2 x 2 + x 3 = 0 x 2 − 4 x 3 = 4 x 3 = − 1 \left\{\begin{array}{l}x_{1}-2 x_{2}+x_{3}=0 \\ x_{2}-4 x_{3}=4 \\ x_{3}=-1\end{array}\right. x12x2+x3=0x24x3=4x3=1
简单进行回代即可。

void Guass(float *A,float *x,float *b,int n)
{
    float *At = (float *)malloc(sizeof(float)*n*n);
    memcpy(At,A,sizeof(float)*n*n);
    float *bt = (float *)malloc(sizeof(float)*n);
    memcpy(bt,b,sizeof(float)*n);
    for (int i=0;i<n;i++)
    {
		float pivot = At[i*n+i];   //对角线元素
		for (int j=i+1;j<n;j++)
		{
	    	float scale=-At[j*n+i]/pivot;   //计算消元时所乘的系数
	    	for (int k=0;k<n;k++)
	    	{
				At[j*n+k]+=scale*At[i*n+k];   //消去元素,一行每一个元素都要相加
	    	}
	    	bt[j]+=scale*bt[i];   //增广形式,向量也需要操作
		}
    }
    printf("At=\n");
    printMat(At,n);

    printf("bt=\n");
    printVec(bt,n);
    
    //回代解方程
    for (int i=n-1;i>=0;i--)
    {
		float sum=0;
		for (int j=i+1;j<n;j++)
		{
	    	sum+=At[i*n+j]*x[j];  //此处从最底层开始计算时不会进入此循环
		}
		x[i]=(bt[i]-sum)/At[i*n+i];
    }
    printf("x=\n");
    printVec(x,n);

    free(At);
    free(bt);
    free(x);
}

执行结果如下图:
在这里插入图片描述

3. 二者的联系

可能大家已经看出来了最后消除完得到了一个上三角矩阵,其实高斯迭代最后所得的即为: U x = y Ux=y Ux=y

但是有个疑问,下三角矩阵L又去哪了?
这个地方就涉及到线代中的矩阵初等变换了,如图所示:
在这里插入图片描述
我们在高斯迭代时对于矩阵做了两次初等行变换,也就相当于在矩阵左边乘了两个初等矩阵:
[ 1 0 0 0 1 0 0 − 5 1 ] [ 1 0 0 0 1 0 − 5 0 1 ] [ 1 − 2 1 0 0 2 − 8 8 5 0 − 5 10 ] = [ 1 − 2 1 0 0 2 − 8 8 0 0 30 − 30 ] \left[\begin{array}{ccc}1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & -5 & 1\end{array}\right]\left[\begin{array}{ccc}1 & 0 & 0 \\ 0 & 1 & 0 \\ -5 & 0 & 1\end{array}\right]\left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 5 & 0 & -5 & 10\end{array}\right]=\left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 0 & 0 & 30 & -30\end{array}\right] 1000150011050100011052201850810=10022018300830
将消元矩阵合并,用E表示则为:
E A = [ 1 0 0 0 1 0 − 5 − 5 1 ] [ 1 − 2 1 0 0 2 − 8 8 5 0 − 5 10 ] = [ 1 − 2 1 0 0 2 − 8 8 0 0 30 − 30 ] = U E A=\left[\begin{array}{ccc}1 & 0 & 0 \\ 0 & 1 & 0 \\ -5 & -5 & 1\end{array}\right]\left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 5 & 0 & -5 & 10\end{array}\right]=\left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 0 & 0 & 30 & -30\end{array}\right]=U EA=1050150011052201850810=10022018300830=U
两边在左乘 E − 1 E^{-1} E1则有:
A = [ 1 − 2 1 0 0 2 − 8 8 5 0 − 5 10 ] = E − 1 U = [ 1 0 0 0 1 0 5 5 1 ] [ 1 − 2 1 0 0 2 − 8 8 0 0 30 − 30 ] = L U A=\left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 5 & 0 & -5 & 10\end{array}\right]=E^{-1} U=\left[\begin{array}{ccc}1 & 0 & 0 \\ 0 & 1 & 0 \\ 5 & 5 & 1\end{array}\right]\left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 0 & 0 & 30 & -30\end{array}\right]=L U A=1052201850810=E1U=10501500110022018300830=LU
这样就成功将矩阵A分解为了一个下三角矩阵(L)和一个上三角矩阵(U)的乘积。但是需要注意的是并不是所有矩阵都可以分解,要求参见表1的前提!

void Lu_doolittle(float *A,float *x,float *b,int n)
{
    float *At = (float *)malloc(sizeof(float)*n*n);
    memcpy(At,A,sizeof(float)*n*n);
    float *bt = (float *)malloc(sizeof(float)*n);
    memcpy(bt,b,sizeof(float)*n);

    //为三角型矩阵L和U分配内存
    float *L = (float *)malloc(sizeof(float)*n*n);
    float *U = (float *)malloc(sizeof(float)*n*n);
    memset(L,0,sizeof(float)*n*n);
    memset(U,0,sizeof(float)*n*n);
    //一边高斯消元一边记录相应的值,构成L和U
    for (int i=0;i<n;i++)
    {
        float pivot =At[i*n+i];
        for (int j=i+1;j<n;j++)
        {
            float scale=-At[j*n+i]/pivot;
            At[j*n+i]=-scale;
            for (int k=i+1;k<n;k++)
            {
                At[j*n+k]+=scale*At[i*n+k];
            }
        }
    }
    //给L矩阵赋值
    for (int i=0;i<n;i++)
    {
        L[i*n+i]=1.00;	//对角线置为1
        for (int j=0;j<i;j++)
            L[i*n+j]=At[i*n+j];//给下方小三角赋值即可
    }
    //给U矩阵赋值
    for (int i=0;i<n;i++)
        for (int j=i;j<n;j++)
            U[i*n+j]=At[i*n+j];
	    
    printf("L=\n");
    printMat(L,n);

    printf("U=\n");
    printMat(U,n);
    
    float *y=(float *)malloc(sizeof(float)*n);
    //从上向下解出向量y
    for (int i=0;i<n;i++)
    {
        float sum=0;
        for (int j=0;j<i;j++)
            sum+=L[i*n+j]*y[j];
        y[i]=(bt[i]-sum)/L[i*n+i];
    }
    //从下向上解出x
    for (int i=n-1;i>=0;i--)
    {
        float sum=0;
        for (int j=i+1;j<n;j++)
            sum+=U[i*n+j]*x[j];
        x[i]=(y[i]-sum)/U[i*n+i];
    }

    printf("x=\n");
    printVec(x,n);
}

4. 部分选主元的LU分解算法

4.1 为什么要选主元?

在进行LU分解时,涉及到除法(计算pilot) 如果分母太大则会导致不稳定的情况 ,如下所示:
假设三位十进制浮点数下计算:
( 0.001 1.00 1.00 2.00 ) ( x 1 x 2 ) = ( 1.00 3.00 ) \left(\begin{array}{ll}0.001 & 1.00 \\ 1.00 & 2.00\end{array}\right)\left(\begin{array}{l}x_{1} \\ x_{2}\end{array}\right)=\left(\begin{array}{l}1.00 \\ 3.00\end{array}\right) (0.0011.001.002.00)(x1x2)=(1.003.00)
则有: l 21 = a 21 a 11 = 1.00 0.001 = 1000 l_{21}=\frac{a_{21}}{a_{11}}=\frac{1.00}{0.001}=1000 l21=a11a21=0.0011.00=1000
L A = ( 1 0 − 1000 1 ) ( 0.001 1.00 1.00 2.00 ) = ( 0.001 1.00 0 − 1000 ) = U L A=\left(\begin{array}{cc}1 & 0 \\ -1000 & 1\end{array}\right)\left(\begin{array}{cc}0.001 & 1.00 \\ 1.00 & 2.00\end{array}\right)=\left(\begin{array}{cc}0.001 & 1.00 \\ 0 & -1000\end{array}\right)=U LA=(1100001)(0.0011.001.002.00)=(0.00101.001000)=U
此处的-1000在计算时不够精确,
− 1000 × 1.00 + 1 × 2.00 = − 0.100 × 1 0 4 + 0.200 × 10 = − 0.100 × 1 0 4 + 0.0002 × 1 0 4 = − 0.100 × 1 0 4 = − 1000 -1000 \times 1.00+1 \times 2.00=-0.100 \times 10^{4}+0.200 \times 10\quad=-0.100 \times 10^{4}+0.0002 \times 10^{4}=-0.100 \times 10^{4}=-1000 1000×1.00+1×2.00=0.100×104+0.200×10=0.100×104+0.0002×104=0.100×104=1000
此处的0.0002被舍去了,最后结果为: x = ( 0 , 1 ) T x=(\mathbf{0}, \mathbf{1})^{\mathrm{T}} x=(0,1)T,与精确值差距很大。

4.2 列主元的LU分解算法(部分选主元)

选主元其实就是为了避免分母很小影响精度的情况出现,因此选取消元后的低阶矩阵内绝对值最大的元素作为主元。此处仅接受列主元的LU分解,列主元只做行变换,相比全主元的方式,可以减少选择主元时的计算量,也可以避免记录交换信息。
在这里插入图片描述
列选主元的LU分解算法其实就是在进行高斯消元的过程中需要先选主元在消元。在矩阵变换中相当于先左乘了一个初等矩阵进行行交换,然后又乘了一个矩阵进行消元。
如下:
A = ( − 3 2 6 10 − 7 0 5 − 1 5 ) A=\left(\begin{array}{ccc}-3 & 2 & 6 \\ 10& -7 & 0 \\ 5 & -1 & 5\end{array}\right) A=3105271605
选主元10,交换第一行和第二行(等同于左乘初等矩阵P),然后进行高斯消元再左乘矩阵F,则有:
P 1 = ( 0 1 0 1 0 0 0 0 1 ) , F 1 = ( 1 3 10 1 − 5 10 1 ) P_{1}=\left(\begin{array}{lll}0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1\end{array}\right), \quad F_{1}=\left(\begin{array}{ccc}1 & \\ \frac{3}{10} & 1 & \\ -\frac{5}{10} & & 1\end{array}\right) P1=010100001,F1=110310511
此时:
A ( 1 ) = F 1 P 1 A = ( 10 − 7 0 0 − 1 10 6 0 5 2 5 ) A^{(1)}=F_{1} P_{1} A=\left(\begin{array}{ccc}10 & -7 & 0 \\ 0 & -\frac{1}{10} & 6 \\ 0 & \frac{5}{2} & 5\end{array}\right) A(1)=F1P1A=1000710125065
再次进行选主元,选择 5 2 \frac{5}{2} 25,交换二三行,再进行高斯消元得:
A ( 2 ) = F 2 P 2 A ( 1 ) = ( 10 − 7 0 5 2 5 31 5 ) \boldsymbol{A}^{(2)}=\boldsymbol{F}_{2} \boldsymbol{P}_{2} \boldsymbol{A}^{(1)}=\left(\begin{array}{rrr}10 & -7 & 0 \\ & \frac{5}{2} & 5 \\ & & \frac{31}{5}\end{array}\right) A(2)=F2P2A(1)=1072505531

A ( 2 ) A^{(2)} A(2)为U,则有 F 2 P 2 F 1 P 1 A = U F_{2} P_{2} F_{1} P_{1} A=U F2P2F1P1A=U,令 L − 1 L^{-1} L1 F 2 P 2 F 1 P 1 F_{2} P_{2} F_{1} P_{1} F2P2F1P1可得:
A = L U = ( − 3 10 − 1 25 1 1 0 0 1 2 1 0 ) ( 10 − 7 0 5 2 5 31 5 ) A=LU=\left(\begin{array}{ccc}-\frac{3}{10} & -\frac{1}{25} & 1 \\ 1 & 0 & 0 \\ \frac{1}{2} & 1 & 0\end{array}\right)\left(\begin{array}{rrr}10 & -7 & 0 \\ & \frac{5}{2} & 5 \\ & \frac{31}{5}\end{array}\right) A=LU=103121251011001072553105
伪代码如下所示:
在这里插入图片描述

二、列主元并行LU分解算法

  • 每次选主元时,只涉及到同一列,因此没有数据通信。
  • 确定主元后,计算 L 的第 k 列
  • 将 l 和 L 的第 k 列传给其他结点
  • 各结点更新自己的数据

伪代码如下所示:
每个节点处理一列,确定主元后,计算消元所需的值,将其和主元位置进行广播。其他节点接收后先进行主元的交换,然后进行消元。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LU分解算法(串行、并行) 的相关文章

  • hp服务器 高性能计算,HP Gen8:为提升数据中心效率而生

    ZDNet至顶网服务器频道 5月21日 北京报道 文 孟庆 xff1a 距离惠普发布新一代Gen8服务器已经过去快两个月的时间了 对于HP ProLiant Gen8的很多新特性 xff0c 业界也在这期间展开了很多讨论和评测 前不久 xf
  • 高性能计算

    信息时代的硬件芯片和存储器价格以摩尔定律的形式下降 xff0c 可是现在处理的数据量也越来越大 我们先以cocoa编程为例 xff0c 然后再结合网格计算 云计算 xff0c 综合对最新的高性能计算技术作介绍 使用 runloop 在coc
  • 数值分析--线性方程组解的算法(6种)(附算法百度云链接,纯手写原创)

    先上干货百度云 纯手写 纯HTML 可直接打开 如下 链接 https pan baidu com s 1LxZptQ6Wz0ROYnyT1x u4g 密码 r7qd 注 参考书籍 数值分析 北京航空航天大学出版社 一 顺序GUASS消去法
  • 《数值分析》-- 高斯求积公式

    文章目录 概述 一 高斯型求积公式的一般理论 1 1 高斯型求积公式和高斯点 1 2 高斯点的特征 二 常用的高斯求积公式 2 1 高斯 勒让德求积公式 Gauss Legendre 2 2 高斯 切比雪夫求积公式 Gauss Chebys
  • Linux(WSL)安装CUDA

    选择CUDA版本 nvidia smi 选择的CUDA版本要比 CUDA version 的版本更低 ps 本机之前已经把CUDA驱动器在windows端安装完成 安装 CUDA 参考 Windows10 11 WSL2 安装nvidia
  • 拉格朗日插值法——matlab代码实现

    公式 function y lagrange x0 y0 x 给定一系列点x0 y0 x是我们要预测的值 由于可以有多个 因此用向量表示 y返回我们的估计值 由于可以有多个 因此用向量表示 n length x 要预测的个数 y zeros
  • 楚列斯基分解法、求矩阵范数的C++实现

    这次的作业如下 随机生成一个 n n n 阶方阵与 n n n 阶向量构成 A
  • matlab实现牛顿下山法

    说起牛顿下山法 首先要提牛顿法 牛顿法是求解非线性方程的一个重要方法 具体可以点击牛顿法 虽然牛顿法作为一个二阶的迭代收敛方法 但是其对于函数和初始点的要求都比较高 而牛顿下山法则是有效降低这些要求的一种技巧 牛顿下山法的迭代公式如下 x
  • LU分解算法(串行、并行)

    一 串行LU分解算法 详细见MIT线性代数 1 LU分解 矩阵分解 LU分解 分解形式 L 下三角矩阵 U 上三角矩阵 目的 提高计算效率 前提 1 矩阵A为方阵 2 矩阵可逆 满秩矩阵 3 消元过程中没有0主元出现 也就是消元过程中不能出
  • 矩阵LU分解

    一 矩阵LU分解定理 设A为n阶矩阵 如果A的顺序主子式Di 0 i 1 2 n 1 则A可以分解为一个单位下三角矩阵L和一个上三角矩阵U的乘积 且这种分解是唯一的 即A LU 二 矩阵LU分解Python代码 自己原创 def lu de
  • 拉格朗日插值多项式的原理介绍及其应用

    插值 不论在数学中的数值分析中 还是在我们实际生产生活中 都不难发现它的身影 比如造船业和飞机制造业中的三次样条曲线 那么 什么是插值呢 我们可以先看一下插值的定义 如下 定义 如果对于每个 1 i n P
  • 阿里云E-HPC+i4p大内存实例,加速寻因生物单细胞数据分析效率

    寻因生物是一家专注于单细胞技术的生物科技企业 拥有自主研发的微孔芯片与油包水双技术单细胞捕获平台 致力于通过国产高通量单细胞全链条产品及服务 将单细胞技术普适化应用于临床及药物研发 助力相关疾病研究 单细胞测序技术呼唤更高计算性能 自单细胞
  • OpenCL学习入门

    1 OpenCL概念 OpenCL是一个为异构平台编写程序的框架 此异构平台可由CPU GPU或其他类型的处理器组成 OpenCL由一门用于编写kernels 在OpenCL设备上运行的函数 的语言 基于C99 和一组用于定义并控制平台的A
  • BLAS+BLACS+LAPACK+SCALAPACK安装

    最快的安装是用下面的scalapack installer 它将自动联网安装SCALAPACK以及所需要的BLAS BLACS LAPACK 下面是简短说明 INTRODUCTION The ScaLAPACK installer is a
  • LU分解(matlab实现)

    LU分解 LU Decomposition 是矩阵分解的一种 可以将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积 主要的算法思路是从下至上地对矩阵A做初等行变换 将对角线左下方的元素变成零 这些行变换的效果等同于左乘一系列单位下三角矩
  • Intel编译器的强大pragma:unroll_and_jam()/nounroll_and_jam()

    Intel官方文档 Hints to the compiler to enable or disable loop unrolling and jamming These pragmas can only be applied to ite
  • 迭代法求解线性方程组(C++实现)

    本系列是数值分析相关算法的文章 这次用迭代法求解线性方程组 不同于上次用高斯消元法之类的求解 迭代法对于稀疏矩阵方程组的运算 会大大提高 而如果用高斯相关的算法求解 会浪费大量资源计算无用的东西 所以有必要研究此算法 本文章主要使用了3个算
  • 正交多项式-勒让德多项式,两类切比雪夫多项式及零点,拉盖尔多项式,埃尔米特多项式

    1 正交多项式 设 n x 是 a
  • 数值分析(10)-数值微分

    整理一下数值分析的笔记 目录 1 误差 2 多项式插值与样条插值 3 函数逼近 4 数值积分与数值微分 THIS 5 线性方程组的直接解法 6 线性方程组的迭代解法 7 非线性方程求根 8 特征值和特征向量的计算 9 常微分方程初值问题的数
  • 在 IBM Cloud 上使用 Spectrum LSF 管理数据

    在 IBM Cloud 上使用 Spectrum LSF 管理数据 在云环境中处理 HPC 工作负载时 要解决的一个关键挑战是如何以最佳方式管理运行工作负载所需的数据 以及可能需要分析以进行进一步处理和决策的输出 通过使用部署在 IBM C

随机推荐

  • 19年电赛经验总结-应该如何准备电赛

    19年电赛经验总结 应该如何准备电赛 写在前面的话 1 赛前准备 2 比赛经历 3 经验总结 写在最后的话 写在前面的话 最近忙着各大厂的实习面试 趁着准备简历的功夫回顾了一下19年电赛的比赛经历 总体来说还算说得过去 现在把我参加电赛的经
  • 目标检测之GFL

    文章目录 前言 1 GFL的主要创新部分 2 结合代码体现创新部分 1 训练阶段的预测输出 2 将bbox边框的回归值由单一确定值 狄拉克分布 变为一定范围的任意概率分布 3 Distribution Focal Loss 4 Qualit
  • 认识k8s

    本篇文章没有什么强逻辑思维 你看下去就对了 讲下本文背景 博主在面试的过程中 不断被现实捶打 竟然有一次被问及了解k8s吗 我滴妈妈咪呀 我只知道工作中公司用的是k8s 但不知道是啥 被问的一脸懵逼 瞬间给面试官留下的印象从高级降为中级 不
  • 所向披靡的响应式开发——如何一招制胜?前端工程师必会技能

    之前也接触过响应式开发 大概就是下载一个响应式网站模板 然后替换图片 哈哈 确实没有系统的学习和了解过响应式开发 最近工作还蛮清闲 找出压箱底很久的响应式开发教程 大概一月前看过一些 然后也忘得差不多la 从头开始学习呗 这套课程还是很基础
  • Web3的2048,Sui 8192能否打开全链游戏的大门?

    作者 Peng SUN Foresight News Sui 8192 一局游戏就是一个NFT Sui 8192智能合约基于Move语言编写 构成非常简单 包括游戏 Game Board与排行榜 Leaderboard 三部分 覆盖方块移动
  • [keil]L6200E: Symbol XXX multiply defined .O...错误解决方法

    当编译时提示这样的错误时 是因为框出来的变量被重复定义了 我们要从定义的地方解决 1 首先 我们全局搜索这个变量 ctrl f 搜索这个变量在工程中被定义的位置 2 如果发现有多个文件中都有定义过 例如在a c和b c中都有int a 0
  • 电容降压整流电源电路

    https www dianziaihaozhe com dianyuan 924 电容降压整流电源电路通常用于低成本取得非隔离的小电流电源 输出电压一般为几伏到二三十伏 输出电流为几毫安到几十毫安 大多取决于所使用的稳压二极管 所能提供的
  • 机器学习和数据科学从业者必读的10本免费英文书

    本文编译自https www kdnuggets com 2018 05 10 more free must read books for machine learning and data science html 夏天本该是放松的季节
  • android首页底部tab动画,Android实现主页底部菜单中间tab图案凸起

    效果图 因为原来的代码底部导航栏使用的是 LinearLayout ImageView TextView 组合 所以 在这里用到了一个及其重要的属性 android clipChildren false 放在其父布局使其生效 达到想要的效果
  • Python __str__方法

    str 方法 1 不定义 str 方法 使用 print 函数输出对象实例时 默认打印对象实例的内存地址 2 定义 str 方法 使用 print 函数或将对象转换为字符串时 自动调用此方法 3 返回值必须是字符串 str 是Python中
  • centos7上hive3.1.3安装及配置

    1 安装背景 hive是基于hadoop的数据仓库软件 部署运行在linux系统之上 安装之前必须保证hadoop环境运行正常 hive本身不是分布式软件 它的分布式主要是借助hadoop实现 存储是hdfs 计算是mapreduce 需要
  • openGL之API学习(九十三)OpenGL中EXT,ARB扩展

    由于OpenGL的标准更新不是很频繁 因此 当某种技术应用流行起来时 显卡厂商为了支持该技术 会使用自己的扩展来实现该功能 但是不同厂商如果有不同的实现 那么程序编写将会异常繁琐 因此多个厂商共同协商使用一致的扩展 这就是EXT扩展 如果这
  • 时序预测

    时序预测 MATLAB实现CNN BiLSTM卷积双向长短期记忆神经网络时间序列预测 风电功率预测 目录 时序预测 MATLAB实现CNN BiLSTM卷积双向长短期记忆神经网络时间序列预测 风电功率预测 预测效果 基本介绍 程序设计 参考
  • java基础之符号

    hello 大家好 今天 小白将继续分享 如果我说的有什么不妥之处 恳请大佬们指出来 如果大家觉得我写的不错 就给我点个赞鼓励一下 小白在此谢谢各位了 众所周知 程序都是按照着一定的规则进行编写的 这些规则被称为语法 只有语法正确了 程序才
  • C++_STL_常用的拷贝和替换算法

    copy 把A数组拷贝到另一个B数组中 void main copy vector
  • windows控制台命令合集

    转自 微点阅读 https www weidianyuedu com windows控制台命令 大集合 开始 运行 命令 集锦 winver 检查Windows版本 wmimgmt msc 打开windows管理体系结构 WMI wupdm
  • 定位Flutter内存问题很难么?

    简介 flutter内存泄漏定位 作者 闲鱼技术 三莅 内存水位升高导致的稳定性问题严重影响app用户体验 所以开发者们非常关注Flutter的内存表现 随着Flutter业务越来越多 闲鱼也面临着oom导致的crash率提升的问题 下面我
  • 两个经典回文字符串问题中的巧妙算法

    问题一 最长回文子串 给定一个字符串 s 找到 s 中最长的回文子串 第一眼的想法是暴力法 由于其时间复杂度高达O n 3 当s过长时效率会特别低 方法一 中心扩展算法 其思想就是遍历一遍字符串 其中在每一个点都进行以其为中心而均匀展开 分
  • 内网隧道搭建ksa工具-端对端-无需公网VPS做流量转发

    1 前言 看雪安全接入 KSA 一款傻瓜式的一键接入私有网络的工具 无论您在任何地点 任何时间 使用任何线路 均可利用这一服务接入自己的私有设备 KSA的服务端和客户端集成在一个可执行文件之中 目前支持Windows macOS和Linux
  • LU分解算法(串行、并行)

    一 串行LU分解算法 详细见MIT线性代数 1 LU分解 矩阵分解 LU分解 分解形式 L 下三角矩阵 U 上三角矩阵 目的 提高计算效率 前提 1 矩阵A为方阵 2 矩阵可逆 满秩矩阵 3 消元过程中没有0主元出现 也就是消元过程中不能出