unitary MUSIC 算法

unitary MUSIC 算法

  论文 A Unitary Transformation Method for Angle-of-Arrival Estimation 中提出了 unitary MUSIC 的算法,直译就是酉 MUSIC 算法,即酉变换 MUSIC 算法。该算法的目的是简化计算复杂度,将传统 MUSIC 算法中的复数 SVD 和复数网格搜索计算转化为实数计算。在学习 unitary MUSIC 之前需要理解 Hermitian 矩阵及 Persymmetric 矩阵的概念及性质:

  1. Hermitian 矩阵指的是满足 A H = A \mathbf{A}^H = \mathbf{A} AH=A 的矩阵 A \mathbf{A} A
  2. Persymmetric 矩阵指的是满足 A J = J A T \mathbf{A}\mathbf{J} = \mathbf{J}\mathbf{A}^T AJ=JAT 的矩阵 A \mathbf{A} A,其中 J \mathbf{J} J 其对角线从左下至右上,很多地方又称 J \mathbf{J} J 为选择矩阵。
  3. 假若矩阵 A \mathbf{A} A 既为 Hermitian 矩阵又为 Persymmetric 矩阵,则满足:
    J A ∗ J = A \mathbf{J}\mathbf{A}^*\mathbf{J}=\mathbf{A} JAJ=A
    其中 A ∗ \mathbf{A}^* A A \mathbf{A} A 的共轭。

  在接下来的讨论中, I \mathbf{I} I J \mathbf{J} J 分别用作表示单位矩阵和选择矩阵,下文中将会出现这两种矩阵的运算,例如 A I \mathbf{A}\mathbf{I} AI J B \mathbf{J}\mathbf{B} JB,设 A \mathbf{A} A B \mathbf{B} B 均为方阵,如果没有特别强调,则说明 I \mathbf{I} I J \mathbf{J} J 分别和 A \mathbf{A} A B \mathbf{B} B 同维度。

算法原理

  前面讨论的子空间算法中,复协方差矩阵的特征值分解是至关重要的一步,然而该步的计算量很高。为了降低计算量,unitary MUSIC 算法考虑利用一个酉矩阵将原先的复协方差矩阵 R \mathbf{R} R 转换成实协方差矩阵,同时传统算法中的复空间搜索向量 a ( θ ) \mathbf{a}(\theta) a(θ) 也用实向量来代替。
  unitary MUSIC 算法的提出基于一个性质,即若不相关的窄带远场信号源射入均匀线阵中,其协方差矩阵不仅是 Hermitian,且 Persymmetric。通常估计的协方差矩阵 R ≜ R ^ \mathbf{R}\triangleq \hat{\mathbf{R}} RR^ 仅仅只是 Hermitian 矩阵但不满足 Persymmetric 性质,需要先获得一个满足 Persymmetric 性质的估计协方差矩阵:
R ≜ 1 2 ( R ^ + J R ^ ∗ J ) \begin{equation*} \mathbf{R}\triangleq \frac{1}{2}(\hat{\mathbf{R}}+ \mathbf{J}\hat{\mathbf{R}}^*\mathbf{J}) \end{equation*} R21(R^+JR^J)
  假设阵元数 M M M 为偶数,unitary MUSIC 算法引入了一个酉矩阵 Q ∈ C M × M \mathbf{Q}\in\mathbb{C}^{M\times M} QCM×M
Q = 1 2 [ I J j J − j I ] \mathbf{Q} = \frac{1}{\sqrt{2}} \begin{bmatrix} \mathbf{I} & \mathbf{J} \\ \mathrm{j}\mathbf{J} & -\mathrm{j}\mathbf{I} \end{bmatrix} Q=2 1[IjJJjI]
其中 I \mathbf{I} I J \mathbf{J} J 分别为单位矩阵和选择矩阵,且该两个矩阵维度均为 M 2 × M 2 \frac{M}{2}\times \frac{M}{2} 2M×2M。易得 Q \mathbf{Q} Q 为酉矩阵,即 Q − 1 = Q H \mathbf{Q}^{-1} = \mathbf{Q}^H Q1=QH,同时满足:
Q ∗ J = Q \mathbf{Q}^*\mathbf{J} = \mathbf{Q} QJ=Q
  至此到了本算法的关键,它在于证明由于 R \mathbf{R} R 是 Hermitian 且 Persymmetric 矩阵, Q R Q H \mathbf{Q}\mathbf{R}\mathbf{Q}^H QRQH 是实对称矩阵

因为 R \mathbf{R} R 为 Hermitian,易得 Q R Q H \mathbf{Q}\mathbf{R}\mathbf{Q}^H QRQH 为 Hermitian;因此只需要证明 Q R Q H \mathbf{Q}\mathbf{R}\mathbf{Q}^H QRQH 是实矩阵,即证明 ( Q R Q H ) ∗ = Q R Q H (\mathbf{Q}\mathbf{R}\mathbf{Q}^H)^* = \mathbf{Q}\mathbf{R}\mathbf{Q}^H (QRQH)=QRQH
( Q R Q H ) ∗ = Q ∗ R ∗ Q T = ( Q ∗ J ) ( J R ∗ J ) ( J Q T ) = Q R Q H \begin{equation*} \begin{aligned} &(\mathbf{Q}\mathbf{R}\mathbf{Q}^H)^* \\ = &\mathbf{Q}^*\mathbf{R}^*\mathbf{Q}^T \\ = &(\mathbf{Q}^*\mathbf{J})(\mathbf{J}\mathbf{R}^*\mathbf{J})(\mathbf{J}\mathbf{Q}^T)\\ = &\mathbf{Q}\mathbf{R}\mathbf{Q}^H \end{aligned} \end{equation*} ===(QRQH)QRQT(QJ)(JRJ)(JQT)QRQH
由此得证。

  综上所述,unitary MUSIC 算法引入酉矩阵 Q \mathbf{Q} Q 并令 R ≜ Q R Q H \mathbf{R}\triangleq\mathbf{Q}\mathbf{R}\mathbf{Q}^H RQRQH,使得酉变换后的协方差矩阵变为实对称矩阵,接着对其特征值分解即可进行后续的搜索步骤。而 ULA 的搜索方向矢量为:
a ( θ ) = [ 1 , e − j 2 π d sin ⁡ θ / λ , ⋯ , e − j ( M − 1 ) 2 π d sin ⁡ θ / λ ] T \mathbf{a}(\theta) = \left[1, e^{-\mathrm{j}2\pi d\sin\theta/\lambda},\cdots,e^{-\mathrm{j}(M-1)2\pi d\sin\theta/\lambda}\right]^T a(θ)=[1,ej2πdsinθ/λ,,ej(M1)2πdsinθ/λ]T
则 unitary MUSIC 算法的搜索方向矢量为 a ( θ ) ≜ Q a ( θ ) \mathbf{a}(\theta)\triangleq\mathbf{Q}\mathbf{a}(\theta) a(θ)Qa(θ)
  为了进一步降低算法计算复杂度,Unitary MUSIC 算法考虑将搜索方向矢量也用实变量代替,做法如下:
a ( θ ) ≜ e j M − 1 2 2 π d sin ⁡ θ / λ Q a ( θ ) = Q [ e j M − 1 2 2 π d sin ⁡ θ / λ , ⋯ , e j 1 2 2 π d sin ⁡ θ / λ , e − j 1 2 2 π d sin ⁡ θ / λ , ⋯ , e − j M − 1 2 2 π d sin ⁡ θ / λ ] T \begin{aligned} \mathbf{a}(\theta) &\triangleq e^{j\frac{M-1}{2}2\pi d\sin\theta/\lambda}\mathbf{Q}\mathbf{a}(\theta) \\ &= \mathbf{Q}\left[e^{\mathrm{j}\frac{M-1}{2}2\pi d\sin\theta/\lambda},\cdots, e^{\mathrm{j}\frac{1}{2}2\pi d\sin\theta/\lambda},e^{-\mathrm{j}\frac{1}{2}2\pi d\sin\theta/\lambda},\cdots,e^{-\mathrm{j}\frac{M-1}{2}2\pi d\sin\theta/\lambda}\right]^T \end{aligned} a(θ)ej2M12πdsinθ/λQa(θ)=Q[ej2M12πdsinθ/λ,,ej212πdsinθ/λ,ej212πdsinθ/λ,,ej2M12πdsinθ/λ]T
不难看出原方向矢量对应的阵列索引位置为 { 0 , 1 , ⋯ , M − 1 } \{0,1,\cdots,M-1\} {0,1,,M1},而更新后方向矢量对应的阵列索引位置为 { − M − 1 2 , − M − 3 2 , ⋯ , − 1 2 , 1 2 , ⋯ , M − 3 2 , M − 1 2 } \{-\frac{M-1}{2},-\frac{M-3}{2},\cdots,-\frac{1}{2},\frac{1}{2},\cdots,\frac{M-3}{2},\frac{M-1}{2}\} {2M1,2M3,,21,21,,2M3,2M1}。此时 unitary MUSIC 算法的搜索方向矢量更新为:
a ‾ ( θ ) = e j M − 1 2 2 π d sin ⁡ θ / λ Q a ( θ ) = 2 [ cos ⁡ ( M − 1 2 2 π d sin ⁡ θ / λ ) ⋮ cos ⁡ ( 1 2 2 π d sin ⁡ θ / λ ) sin ⁡ ( − 1 2 2 π d sin ⁡ θ / λ ) ⋮ sin ⁡ ( − M − 1 2 2 π d sin ⁡ θ / λ ) ] \begin{aligned} \overline{\mathbf{a}}(\theta)&= e^{\mathrm{j}\frac{M-1}{2}2\pi d\sin\theta/\lambda}\mathbf{Q}\mathbf{a}(\theta) \\ &= \sqrt{2} \begin{bmatrix} \cos\left(\frac{M-1}{2}2\pi d\sin\theta/\lambda\right) \\ \vdots \\ \cos\left(\frac{1}{2}2\pi d\sin\theta/\lambda\right) \\ \sin\left(-\frac{1}{2}2\pi d\sin\theta/\lambda\right) \\ \vdots \\ \sin\left(-\frac{M-1}{2}2\pi d\sin\theta/\lambda\right) \end{bmatrix} \end{aligned} a(θ)=ej2M12πdsinθ/λQa(θ)=2 cos(2M12πdsinθ/λ)cos(212πdsinθ/λ)sin(212πdsinθ/λ)sin(2M12πdsinθ/λ)
  当 M M M 为奇数时,酉矩阵 Q \mathbf{Q} Q 的形式为:
Q = 1 2 [ I O J O T 2 O T j J O − j I ] \mathbf{Q} = \frac{1}{\sqrt{2}} \begin{bmatrix} \mathbf{I} & \mathbf{O} & \mathbf{J} \\ \mathbf{O}^T & \sqrt{2} & \mathbf{O}^T \\ \mathrm{j}\mathbf{J} & \mathbf{O} & -\mathrm{j}\mathbf{I} \end{bmatrix} Q=2 1 IOTjJO2 OJOTjI
其中 O \mathbf{O} O 为零矩阵。

进一步理解

  在上一小节中,我整理了论文对于 unitary MUSIC 算法的解释及证明,其核心思想在于酉矩阵 Q \mathbf{Q} Q 的提出。在本小节中,我将进一步对 Q \mathbf{Q} Q 的作用谈谈自己的理解。
  在论文中,unitary 算法一直强调 R \mathbf{R} R 的 Hermitian 及 Persymmetric 性质,因为假若 R \mathbf{R} R 不满足这两个性质, Q R Q H \mathbf{Q}\mathbf{R}\mathbf{Q}^H QRQH 将不是实矩阵,但是利用 R e ( Q R Q H ) \mathrm{Re}(\mathbf{Q}\mathbf{R}\mathbf{Q}^H) Re(QRQH) 来进行后续的估计其实是可以估计角度的。假设 M = 4 M=4 M=4 φ = 2 π d sin ⁡ θ / λ \varphi = 2\pi d \sin\theta/\lambda φ=2πdsinθ/λ,展开 Q a ( θ ) \mathbf{Q}\mathbf{a}(\theta) Qa(θ)
Q a ( θ ) = 2 [ 1 0 0 1 0 1 1 0 0 j − j 0 j 0 0 − j ] [ 1 e − j φ e − j 2 φ e − j 3 φ ] = 2 [ 1 + e − j 3 φ e − j φ + e − j 2 φ j ( e − j φ − e − j 2 φ ) j ( 1 − e − j 3 φ ) ] = 2 e − j 3 2 φ [ e j 3 2 φ + e − j 3 2 φ e j 1 2 φ + e − j 1 2 φ j ( e j 1 2 φ − e − j 1 2 φ ) j ( e j 3 2 φ − e − j 3 2 φ ) ] = 2 e − j 3 2 φ [ cos ⁡ ( 3 2 φ ) cos ⁡ ( 1 2 φ ) sin ⁡ ( − 1 2 φ ) sin ⁡ ( − 3 2 φ ) ] = e − j 3 2 φ a ‾ ( θ ) \begin{aligned} \mathbf{Q}\mathbf{a}(\theta) &= \sqrt{2} \begin{bmatrix} 1 & 0 & 0 & 1 \\ 0 & 1 & 1 & 0 \\ 0 & \mathrm{j} & -\mathrm{j} & 0 \\ \mathrm{j} & 0 & 0 & -\mathrm{j} \end{bmatrix} \begin{bmatrix} 1\\ e^{-\mathrm{j}\varphi}\\ e^{-\mathrm{j}2\varphi}\\ e^{-\mathrm{j}3\varphi} \end{bmatrix} \\ &=\sqrt{2}\begin{bmatrix} 1 + e^{-\mathrm{j}3\varphi}\\ e^{-\mathrm{j}\varphi} + e^{-\mathrm{j}2\varphi}\\ \mathrm{j}(e^{-\mathrm{j}\varphi} - e^{-\mathrm{j}2\varphi})\\ \mathrm{j}(1 - e^{-\mathrm{j}3\varphi}) \end{bmatrix}\\ &=\sqrt{2}e^{-\mathrm{j}\frac{3}{2}\varphi}\begin{bmatrix} e^{\mathrm{j}\frac{3}{2}\varphi} + e^{-\mathrm{j}\frac{3}{2}\varphi}\\ e^{\mathrm{j}\frac{1}{2}\varphi} + e^{-\mathrm{j}\frac{1}{2}\varphi}\\ \mathrm{j}(e^{\mathrm{j}\frac{1}{2}\varphi} - e^{-\mathrm{j}\frac{1}{2}\varphi})\\ \mathrm{j}(e^{\mathrm{j}\frac{3}{2}\varphi} - e^{-\mathrm{j}\frac{3}{2}\varphi}) \end{bmatrix}\\ &=\sqrt{2}e^{-\mathrm{j}\frac{3}{2}\varphi}\begin{bmatrix} \cos(\frac{3}{2}\varphi) \\ \cos(\frac{1}{2}\varphi) \\ \sin(-\frac{1}{2}\varphi) \\ \sin(-\frac{3}{2}\varphi) \end{bmatrix}\\ &=e^{-\mathrm{j}\frac{3}{2}\varphi}\overline{\mathbf{a}}(\theta) \end{aligned} Qa(θ)=2 100j01j001j0100j 1ejφej2φej3φ =2 1+ej3φejφ+ej2φj(ejφej2φ)j(1ej3φ) =2 ej23φ ej23φ+ej23φej21φ+ej21φj(ej21φej21φ)j(ej23φej23φ) =2 ej23φ cos(23φ)cos(21φ)sin(21φ)sin(23φ) =ej23φa(θ)
  至此可以得到 Q a ( θ ) = e − j M − 1 2 φ a ‾ ( θ ) \mathbf{Q}\mathbf{a}(\theta)=e^{-\mathrm{j}\frac{M-1}{2}\varphi}\overline{\mathbf{a}}(\theta) Qa(θ)=ej2M1φa(θ),进一步我们可以得到:
Q A = e − j M − 1 2 φ A ‾ \mathbf{Q}\mathbf{A}=e^{-\mathrm{j}\frac{M-1}{2}\varphi}\overline{\mathbf{A}} QA=ej2M1φA
其中 A ‾ ∈ R M × K \overline{\mathbf{A}}\in\mathbb{R}^{M\times K} ARM×K 是由 K K K 个形如 a ‾ ( θ ) \overline{\mathbf{a}}(\theta) a(θ) 的实向量组成的矩阵。最后一步,我们可以得到:
Q R Q H = ( e − j M − 1 2 φ A ‾ ) R s ( e j M − 1 2 φ A ‾ T ) = A ‾ R s A ‾ T \begin{aligned} \mathbf{Q}\mathbf{R}\mathbf{Q}^H&=\left(e^{-\mathrm{j}\frac{M-1}{2}\varphi}\overline{\mathbf{A}}\right)\mathbf{R}_s\left(e^{\mathrm{j}\frac{M-1}{2}\varphi}\overline{\mathbf{A}}^T\right)\\ &=\overline{\mathbf{A}}\mathbf{R}_s\overline{\mathbf{A}}^T \end{aligned} QRQH=(ej2M1φA)Rs(ej2M1φAT)=ARsAT
因此有 R e ( Q R Q H ) = A ‾ R e ( R s ) A ‾ T \mathrm{Re}(\mathbf{Q}\mathbf{R}\mathbf{Q}^H) = \overline{\mathbf{A}}\mathrm{Re}(\mathbf{R}_s)\overline{\mathbf{A}}^T Re(QRQH)=ARe(Rs)AT,不难看出即使 R \mathbf{R} R 不满足 Hermitian 及 Persymmetric 性质,仍然不会破坏正交性。
  总的来说, Q \mathbf{Q} Q 的作用就是使得方向矢量转为实向量,如此便可以利用协方差矩阵的实部进行后续的计算。

算法步骤

  unitary MUSIC 算法步骤如下(输入为阵列接收矩阵 X \mathbf{X} X):

  1. 计算协方差矩阵 R = 1 T X X H \mathbf{R} = \frac{1}{T} \mathbf{X}\mathbf{X}^H R=T1XXH 和酉矩阵 Q \mathbf{Q} Q,接着以 R ≜ Q R Q H \mathbf{R}\triangleq\mathbf{Q}\mathbf{R}\mathbf{Q}^H RQRQH 更新协方差矩阵。
  2. R \mathbf{R} R 进行特征值分解,并对特征值进行排序,然后取得 M − K M-K MK 个较小特征值对应的特征向量来组成噪声子空间 U n \mathbf{U}_n Un
  3. 以下式遍历 θ ∈ [ − 9 0 ∘ , 9 0 ∘ ] \theta \in [-90^{\circ}, 90^{\circ}] θ[90,90]
    P ( θ ) = 1 a ‾ H ( θ ) U n U n T a ‾ ( θ ) \begin{equation*} P(\theta) = \frac{1}{\overline{\mathbf{a}}^H(\theta)\mathbf{U}_n\mathbf{U}_n^T\overline{\mathbf{a}}(\theta)} \end{equation*} P(θ)=aH(θ)UnUnTa(θ)1
    此时得到一组 P ( θ ) P(\theta) P(θ) K K K 个最大值对应的 θ \theta θ 就是需要返回的结果。

代码实现

clear; close all; clc;%% Parameters
lambda     = 3e8/1e9;         % wavelength, c/f
d          = lambda/4;        % distance between sensors
theta      = [10,20];         % true DoAs, 1 times K vector
theta      = sort(theta);
M          = 16;              % # of sensors
T          = 500;             % # of snapshots
K          = length(theta);   % # of signals
noise_flag = 1;
SNR        = 0;               % signal-to-noise ratio
grid       = 0.1;             % search grid%% Signals
R = generateSignal(M,K,T,theta,lambda,d,noise_flag,SNR);%% DoA 
% unitary-MUSIC
[theta_unitary_music,P_unitary_music] = unitaryMUSIC(R,M,K,lambda,d,grid);%% plot
figure;
hold on;
ang_list = -90:grid:90;
plot(ang_list, P_unitary_music);
hold off;function [R,X,A,S] = generateSignal(M,K,T,theta,lambda,d,noise_flag,SNR)S = exp(1j*2*pi*randn(K,T)); % signal matrixA = exp(-1j*(0:M-1)'*2*pi*d/lambda*sind(theta)); % steering vector matrixN = noise_flag.*sqrt(10.^(-SNR/10))*(1/sqrt(2))*(randn(M,T)+1j*randn(M,T)); % noise matrixX = A*S+N; % received matrixR = X*X'/T; % covariance matrix
endfunction [theta,P] = unitaryMUSIC(R,M,K,lambda,d,grid)M_half = floor(M/2);O = zeros(M_half,1);I = eye(M_half);J = fliplr(I);if mod(M,2) == 0Q = [I,J;1j*J,-1j*I]./sqrt(2);elseQ = [I,O,J;O',sqrt(2),O';1j*J,O,-1j*I]./sqrt(2);endR = real(Q*R*Q');[U,~] = svd(R);Un = U(:, K+1:M);a_list = exp(-1j*(0:M-1).'*2*pi*d/lambda*sind(-90:grid:90));a_list = a_list.*exp(1j*(M-1)*ones(M,1)*pi*d/lambda*sind(-90:grid:90));a_list = real(Q*a_list);P = arrayfun(@(i) 1/norm(Un'*a_list(:,i),'fro'),1:size(a_list,2)); % spectral spectrum grid searchP = 10*log10(P./max(P));[~, idx] = findpeaks(P,'NPeaks',K,'SortStr','descend'); % find K peakstheta = sort((idx-1)*grid-90);
end

参考内容

  1. Huarng K C, Yeh C C. A unitary transformation method for angle-of-arrival estimation[J]. IEEE Transactions on Signal Processing, 1991, 39(4): 975-977.
  2. 【wikipedia】Persymmetric matrix
  3. 【wikipedia】Hermitian matrix

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【shell-10】shell实现的各种kafka脚本

kafka-shell工具 背景日志 log一.启动kafka->(start-kafka)二.停止kafka->(stop-kafka)三.创建topic->(create-topic)四.删除topic->(delete-topic)五.获取topic列表->(list-topic)六. 将文件数据 录入到kafka->(file-to-kafka)七.将kafka数据 下载到文件-&g…

Linux内核中USB设备驱动实现

USB 设备驱动: 一、USB 描述符:(存在于USB 的E2PROM里面) 1、 设备描述符:struct usb_device_descriptor 2、 配置描述符:struct usb_config_descriptor 3、 接口描述符:struct usb_interfa…

linux深度学习开发基础命令——极简版

linux深度学习开发基础命令——极简版 本博客只是阐述常用的部分shell命令,更为全面的内容请参考其他博客 1. 创建python虚拟环境 默认使用conda创建 conda create -yourenv_name pyhton3.x 查看全部虚拟环境 conda env list 激活虚拟环境 conda activate env_name …

GO——GPM

参考:https://juejin.cn/post/6844904130398404616 并发模型 参考:https://zhuanlan.zhihu.com/p/137339439 多进程 要点 主进程监听每进来一个请求,fork子进程处理 缺点 进程占用高,服务器负载高进程间通信困难 参考&#xff…

2024 CKA 题库 | 15、备份还原 etcd

不等更新题库 文章目录 15、备份还原 etcd题目:考点:参考链接:解答:备份快照恢复快照 检查 15、备份还原 etcd 题目: 设置配置环境 此项目无需更改配置环境。但是,在执行此项目之前,请确保您已返回初始节点。 [candidatemaster01] $ exit #…

【Deeplabv3+】Ubutu18.04中使用pytorch复现Deeplabv3+第三步)-----CityscapesScripts生成自己的标签

本文是在前面两篇文章的基础上,讲解如何更改训练数据集颜色,需要与前面两篇文章连起来看。 本文用于修改cityscapes数据集的标签颜色与Semankitti数据集的标签一致,对修改后的数据集进行训练。需要下载两个开发工具包和一个数据集&#xff0…

Git标签推送

标签默认属于本地分支&#xff0c;推送分支的时候并不会上传。需要自己手动推送 通过命令 git push origin <tagname>推送指定的标签 通过命令git push origin --tags批量推送所有的标签 在VS里打开git命令行窗口的方法&#xff1a;Git更改-操作-打开命令行提示符 对于…

1.19信息学,信息熵(wordle)

所谓均方误差实际上就是方差 分析&#xff1a;对单词进行编码后&#xff0c;采用聚类方法&#xff0c;可以将单词难度分为三类或者更多&#xff0c;如困难、一般、简单。然后对每一类的单词可视化分析&#xff0c;并描述数据得出结论。 聚类算法较多&#xff0c;在论文中可以…

Docker镜像

创建镜像有三种方法&#xff0c;分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。 基于现有镜像创建 首先启动一个镜像&#xff0c;在容器里做修改 然后将修改后的容器提交为新的镜像&#xff0c;需要使用该容器的 ID 号创建新镜像 常用选项&#xff1a; -…

【Unity】【游戏开发】Pico打包后项目出现运行时错误如何Debug

【背景】 开发过程中的报错可以通过控制台查看&#xff0c;但是PICO项目这类依赖特定设备环境的应用往往存在打包后在设备端发生运行时错误。这时如何能查看到Debug信息呢&#xff1f; 【分析】 Pico也是安卓系统&#xff0c;所以这个问题就可以泛化为Unity有哪些在安卓端运…

Linux系统中编写bash脚本进行mysql的数据同步

一、为何要用脚本做数据同步 &#xff08;一&#xff09;、问题 我们的视频监控平台云服务器&#xff0c;需要向上级的服务器定期同步一些数据表的数据&#xff0c;前期做了个程序&#xff0c;可以实现同步。但是&#xff0c;现在数据库的结构改了&#xff0c;结果又需要该程序…

C++实现推箱子游戏

推箱子游戏 运行之后的效果如视频所示&#xff0c;在完成游戏后播放音乐 准备工作&#xff1a;建立一个新的文件夹&#xff0c;并在文件夹中任意增加一张背景图片&#xff0c;以及各个部件的照片文件 因为这里用到了贴图技术&#xff0c;要使用graphic.h这个函数&#xff0c…

用于 C/C++ Debug 的宏函数

Debug.h 用于打印 Debug 信息的小工具&#xff1a; #pragma once#include <stdio.h>#define DEBUG 1#define pn puts("") #define where printf("%s(%d)-<%s>.\n\n", __FILE__, __LINE__, __FUNCTION__)#if (DEBUG 1) #define print_error(…

海外云手机三大优势

在全球化潮流下&#xff0c;企业因业务需求对海外手机卡等设备的需求不断攀升&#xff0c;推动了海外云手机业务的蓬勃发展。相较于自行置备手机设备&#xff0c;海外云手机不仅能够降低成本&#xff0c;还具备诸多优势&#xff0c;让我们深入探讨其中的三大黄金优势。 经济实惠…

【Linux】进程概述

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

统计学-R语言-8.1

文章目录 前言方差分析方差分析的原理什么是方差分析误差分解 单因子方差分析数学模型效应检验 练习 前言 本片开始介绍有关方差分析的知识。 方差分析 方差分析的基本原理是在20世纪20年代由英国统计学家Ronald A.Fisher在进行实验设计时为解释实验数据而首先引入的。方差分…

最新多功能PHP图床源码 /兰空图床Lsky Pro开源版v2.1/ 单纯的图床程序源码

源码介绍&#xff1a; Lsky Pro 是一个用于在线上传、管理图片的图床程序&#xff0c;中文名&#xff1a;兰空图床&#xff0c;你可以将它作为自己的云上相册&#xff0c;亦可以当作你的写作贴图库。 该程序的最初版本诞生于2017年10月&#xff0c;由ThinkPHP 5框架精心打造而…

【Linux 基础】常用基础指令(上)

文章目录 一、 创建新用户并设置密码二、ls指令ls指令基本概念ls指令的简写操作 三、pwd指令四、cd指令五、touch指令六、rm指令七、mkdir指令八、rmdir 指令 一、 创建新用户并设置密码 ls /home —— 查看存在多少用户 whoami —— 查看当前用户名 adduser 用户名 —— 创建新…

Python高超音速导弹

Python高超音速导弹的全自动化开发研发具有重要性的原因如下&#xff1a; 提高研发效率&#xff1a;全自动化开发可以通过自动化工具和流程&#xff0c;快速完成各种任务&#xff0c;包括代码编写、测试、集成和部署等。这样可以大大提高研发效率&#xff0c;缩短开发周期。 减…

08 BGP 华为官方文档 十一条选路原则

BGP 华为官方文档 十一条选路原则 丢弃下一跳不可达的路由 1&#xff09;比较“协议首选值-pref-val”属性&#xff0c;数值越大越好&#xff0c;默认值是0&#xff0c;只在本设备生效&#xff0c;不在网络中传递 2&#xff09;比较“本地优先级-local_pref”属性&#xff0c;…