LS和MMSE信道估计

1️⃣ LS(最小二乘)信道估计

OFDM系统的信道估计常在频域进行,因为OFDM本身就是基于频域的。频域模型可以表示为:
Y ( f ) = X ( f ) H ( f ) + Z ( f ) Y(f)=X(f) H(f)+Z(f) Y(f)=X(f)H(f)+Z(f)
其中, Y ( f ) Y(f) Y(f)表示接收信号的频域表示, X ( f ) X(f) X(f)表示发送信号的频域表示, H ( f ) H(f) H(f)表示系统的频率响应【对于OFDM系统,系统的频率响应是是单位脉冲响应的h(n)的DTFT】。为简化描述,下面的 Y ( f ) Y(f) Y(f) X ( f ) X(f) X(f) H ( f ) H(f) H(f)分别表示为 Y Y Y X X X H H H

LS信道估计的目标是最小化下面的代价函数:
J ( H ^ L S ) = ∥ Y − X H ^ L S ∥ 2 J(\hat{H}_{L S})=\|Y-X \hat{H}_{L S}\|^2 J(H^LS)=YXH^LS2
其中, H ^ L S \hat{H}_{L S} H^LS表示LS信道估计值

令上面的代价函数关于 H ^ \hat{H} H^ 的偏导数等于 0 ,即

∂ J ( H ^ L S ) ∂ H ^ L S = − 2 ( X H Y ) ∗ + 2 ( X H X H ^ ) ∗ = 0 \frac{\partial J(\hat{H}_{L S})}{\partial \hat{H}_{L S}}=-2\left(X^{\mathrm{H}} Y\right)^*+2\left(X^{\mathrm{H}} X\hat{H}\right)^*=0 H^LSJ(H^LS)=2(XHY)+2(XHXH^)=0

然后可以得到 X H X H ^ = X H Y X^{H} X \hat{H}=X^{\mathrm{H}} Y XHXH^=XHY ,由此得到LS信道估计的解为:

H ^ L S = ( X H X ) − 1 X H Y = X − 1 Y \hat{H}_{\mathrm{LS}}=\left(X^{\mathrm{H}}X\right)^{-1} X^{\mathrm{H}} Y=X^{-1} Y H^LS=(XHX)1XHY=X1Y

在OFDM系统中,可以用导频信号来得到 H ^ L S \hat{H}_{\mathrm{LS}} H^LS。对于上式,X是发送的导频信号,Y是接收的导频信号。

由于导频符号的数量有限,通常需要对LS估计结果进行插值来估算完整的数据符号【要传输的OFDM符号】的信道估计

LS 信道估计的均方误差(MSE)为

M S E L S = E { ( H − H ^ L S ) H ( H − H L S ) } = E { ( H − X − 1 Y ) H ( H − X − 1 Y ) } = E { ( X − 1 Z ) H ( X − 1 Z ) } = E { Z H ( X X H ) − 1 Z } = σ z 2 σ x 2 \begin{aligned} \mathrm{MSE}_{\mathrm{LS}} & =E\left\{\left(H-\hat{H}_{\mathrm{LS}}\right)^{\mathrm{H}}\left(H-H_{\mathrm{LS}}\right)\right\} \\ & =E\left\{\left(H-X^{-1} Y\right)^{\mathrm{H}}\left(H-X^{-1} Y\right)\right\} \\ & =E\left\{\left(X^{-1} Z\right)^{\mathrm{H}}\left(X^{-1} Z\right)\right\} \\ & =E\left\{Z^{\mathrm{H}}\left(X X^{\mathrm{H}}\right)^{-1} Z\right\} \\ & =\frac{\sigma_z^2}{\sigma_x^2} \end{aligned} MSELS=E{(HH^LS)H(HHLS)}=E{(HX1Y)H(HX1Y)}=E{(X1Z)H(X1Z)}=E{ZH(XXH)1Z}=σx2σz2

注意,上式中的 MSE 与信噪比 σ x 2 / σ z 2 \sigma_x^2 / \sigma_z^2 σx2/σz2 成反比,噪声越大,误差越小。这意味着LS估计增强了噪声,在信道处于深度衰落时更是如此。然而,LS 方法由于简单而被广泛应用于信道估计。


2️⃣ MMSE(最小均方误差)信道估计

MMSE估计是LS估计的改进,在LS估计的基础上乘以加权矩阵 W W W,使之与实际信道参数更为接近。

同样的,对于OFDM系统,频域模型可以表示为:
Y ( f ) = X ( f ) H ( f ) + Z ( f ) Y(f)=X(f) H(f)+Z(f) Y(f)=X(f)H(f)+Z(f)
其中, Y ( f ) Y(f) Y(f)表示接收信号的频域表示, X ( f ) X(f) X(f)表示发送信号的频域表示, H ( f ) H(f) H(f)表示系统的频率响应【对于OFDM系统,系统的频率响应是是单位脉冲响应的h(n)的DTFT】。为简化描述,下面的 Y ( f ) Y(f) Y(f) X ( f ) X(f) X(f) H ( f ) H(f) H(f)分别表示为 Y Y Y X X X H H H

MMSE信道估计的目标是最小化下面的代价函数:
J ( H ^ M M S E ) = E { ∥ e ∥ 2 } = E { ∥ H − H ^ M M S E ∥ 2 } = E { ∥ H − W H ^ L S ∥ 2 } \begin{aligned} \mathrm{J}(\hat{\mathrm{H}}_{\mathrm{MMSE}}) & =\mathrm{E}\left\{\|\mathrm{e}\|^2\right\} \\ & =\mathrm{E}\left\{\|\mathrm{H}-\hat{\mathrm{H}}_{\mathrm{MMSE}}\|^2\right\} \\ & =\mathrm{E}\left\{\left\|\mathrm{H}-\mathrm{W} \hat{\mathrm{H}}_{\mathrm{LS}}\right\|^2\right\} \end{aligned} J(H^MMSE)=E{e2}=E{HH^MMSE2}=E{ HWH^LS 2}
其中, H \mathrm{H} H表示信道的真实值, H ^ M M S E \hat{\mathrm{H}}_{\mathrm{MMSE}} H^MMSE表示MMSE信道估计值

需要特别说明的是:MMSE作为一个信道估计的方法,怎么能够在估计的时候使用真实的信道参量值呢?在实际应用过程中,由于无法获得真实信道值,因此MMSE方法无法直接应用,而是通过在仿真中预先计算加权矩阵 W W W,然后结合LS估计结果来进行MMSE信道估计
干扰管理学习日志4-------信道估计方法 LS(最小二乘)、MMSE(最小均方误差)

损失函数最小的条件为: e = H − H ^ M M S E = H − W H ^ L S \mathrm{e}=\mathrm{H}-\hat{\mathrm{H}}_{\mathrm{MMSE}}=\mathrm{H}-\mathrm{W} \hat{\mathrm{H}}_{\mathrm{LS}} e=HH^MMSE=HWH^LS H ^ L S \hat{\mathrm{H}}_{\mathrm{LS}} H^LS 正交

经过一系列的计算, H ^ M M S E \hat{H}_{\mathrm{MMSE}} H^MMSE可以表示为:

H ^ M M S E = W H ~ = R H H ~ R H ~ H ~ − 1 H ~ = R H H ~ ( R H H + σ z 2 σ x 2 I ) − 1 H ~ \begin{aligned} \hat{H}_{\mathrm{MMSE}} & =W \tilde{H}=R_{H \tilde{H}} R_{\tilde{H} \tilde{H}}^{-1} \tilde{H} \\ & =R_{H \tilde{H}}\left(R_{H H}+\frac{\sigma_z^2}{\sigma_x^2} I\right)^{-1} \tilde{H} \end{aligned} H^MMSE=WH~=RHH~RH~H~1H~=RHH~(RHH+σx2σz2I)1H~
其中, H ~ \tilde{H} H~表示LS信道估计 H ^ L S \hat{H}_{\mathrm{LS}} H^LS R H H ~ R_{H \tilde{H}} RHH~ 是频域上真实信道 H H H H ~ \tilde{H} H~之间的互相关矩阵, R H ~ H ~ R_{\tilde{H} \tilde{H}} RH~H~ H ~ \tilde{H} H~ 的自相关矩阵, R H H R_{HH} RHH 表示真实信道 H H H的自相关矩阵, σ z 2 \sigma_z^2 σz2 为噪声方差, σ x 2 \sigma_{\mathrm{x}}^2 σx2 为发送信号矢量方差, I I I表示单位矩阵


3️⃣ LMMSE(线性最小均方误差)信道估计

LMMSE信道估计是MMSE估计的一种简化形式,假设信道是线性的,信道估计的结果为:
H ^ L M M S E = W H ~ = R H H ( R H H + σ z 2 σ x 2 I ) − 1 H ~ \hat{H}_{\mathrm{LMMSE}}=W\tilde{H}=R_{H H}\left(R_{H H}+\frac{\sigma_z^2}{\sigma_x^2} I\right)^{-1}\tilde{H} H^LMMSE=WH~=RHH(RHH+σx2σz2I)1H~

其中, R H H R_{H H} RHH 是信道的自相关矩阵,描述了信道不同时间(或频率)之间的相关性。 σ x 2 σ x 2 \frac{\sigma_x^2}{\sigma_x^2} σx2σx2 是信噪比(SNR)的倒数。 I I I 是单位矩阵。

对于 R H H R_{H H} RHH,其中的每个元素可以表示为 R H H ( i , j ) R_{H H}(i,j) RHH(i,j),代表信道在第 i i i个和第 j j j个子载波上的相关性。这个相关性是基于 信道的时间相关性频率相关性 计算出来的:
R H H ( i , j ) = 1 − e − t max ⁡ ( 1 t r m s + i ⋅ 2 π ( i − 1 ) N ) t r m s ⋅ ( 1 − e − t max ⁡ t r m s ) ⋅ ( 1 t r m s + i ⋅ 2 π ( i − 1 ) N ) R_{H H}(i,j)=\frac{\left.1-e^{-t_{\max }\left(\frac{1}{t_{\mathrm{rms}}}+\mathrm{i} \cdot \frac{2 \pi(i-1)}{N}\right.}\right)}{t_{\mathrm{rms}} \cdot\left(1-e^{-\frac{t_{\max }}{t_{\mathrm{rms}}}}\right) \cdot\left(\frac{1}{t_{\mathrm{rms}}}+\mathrm{i} \cdot \frac{2 \pi(i-1)}{N}\right)} RHH(i,j)=trms(1etrmstmax)(trms1+iN2π(i1))1etmax(trms1+iN2π(i1))
t max  t_{\text {max }} tmax  是信道延迟的最大时间
t r m s t_{\mathrm{rms}} trms 是信道的时间相关性常数,表示信道变化的速度
N N N 是子载波的数量
i i i j j j 分别表示自相关矩阵中的行和列索引,对应子载波的频率索引


4️⃣ 代码

这里基于OFDM系统分析LS和LMMSE的代码,代码无误,可以运行:

在这里插入图片描述

%%%%%%%%%%%%%%%%%%%%%%LS/LMMSE信道估计OFDM仿真系统%%%%%%%%%%%%%%%%%%%
clear all;
fprintf('LS/LMMSE信道估计仿真\n');%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%
%调制方式-QPSK
%每组中2个比特看作是一个4进制的码元
modulation_mode = 4;
%导频符号与数据符号之间的间隔
pilot_interv = 8;
%OFDM符号中加入8个循环前缀
Guard = 8;
%每个OFDM符号中子载波的数量,即分组的数量
num_carrier = 64;
%OFDM符号数
num_symbol = 50;
%信噪比范围从1到20
SNR = 1:1:20;
%进行20次仿真
num_epoch = 20;
%初始化记录每个SNR和每次仿真中LS和LMMSE误码数的数组
num_bit_err_ls = zeros(length(SNR),num_epoch);
num_bit_err_lmmse = zeros(length(SNR),num_epoch);%%%%%%%%%%%%%%%%%%%%%%主程序%%%%%%%%%%%%%%%%%%%
%-----------信号生成与调制-----------
for snr_index = 1:length(SNR)fprintf('信噪比为%f\n\n',SNR(snr_index));for epoch = 1:num_epoch%随机生成比特流,4进制码元,从0-3中随机生成%大小为num_carrier*num_symbolBit_Tx = randi([0,3],1,num_carrier*num_symbol);%将生成的比特流进行QPSK调制modulated_Bit = qammod(Bit_Tx,modulation_mode);%-----------导频插入与OFDM符号生成-----------%导频在插入前也需要调制,随机生成导频符号并进行QPSK调制。导频符号用于信道估计modulated_pilot = qammod(randi([0,3],num_carrier,1),modulation_mode);%计算在num_symbol个OFDM符号中,大约有多少个导频符号(ceil确保向上取整)%+1: 额外加1个导频符号,用于在数据的最后再加一个导频点,确保信道估计能够覆盖整个频域范围num_pilot = ceil(num_symbol/pilot_interv)+1;%计算OFDM帧中总的符号数(导频符号 + 数据符号)num_data = num_pilot + num_symbol;%创建一个长度为num_pilot的零向量,用于存储每个导频符号的位置pilot_index = zeros(1,num_pilot);%创建一个长度为num_symbol的零向量,用于存储数据符号的位置bit_index = zeros(1,num_symbol);%这里的num_pilot-1是因为最后一个导频位置是特殊处理的for i = 1:num_pilot-1%i-1: 这里的i是从1开始的索引,因此要先-1,让索引从0开始计算%pilot_interv+1: 每个导频之间的间隔是pilot_interv个数据符号,但是导频位置还需要向右偏移1个位置,所以是pilot_interv+1%+1: 使第一个导频符号的位置为1%pilot_interv = 8%i=1: pilot_index(1)=(1-1)*(8+1) + 1 = 1%i=2: pilot_index(2)=(2-1)*(8+1) + 1 = 10%i=3: pilot_index(3)=(3-1)*(8+1) + 1 = 19%i=4: pilot_index(4)=(4-1)*(8+1) + 1 = 28pilot_index(i) = (i-1)*(pilot_interv+1)+1;end%最后一个导频点固定在最后一个符号的位置,确保信道估计能够覆盖整个符号序列pilot_index(num_pilot) = num_data;%计算数据符号的位置%i=1: bit_index(1) = 1 + ceil(1/8) = 2%i=2: bit_index(2) = 2 + ceil(2/8) = 3%i=3: bit_index(3) = 3 + ceil(3/8) = 4%……%i=8: bit_index(8) = 8 + ceil(8/8) = 9%i=9: bit_index(9) = 9 + ceil(9/8) = 11 (因为第十个位置是导频)for i = 1:num_symbolbit_index(i) = i+ceil(i/(pilot_interv));end%插入导频data_Tx = zeros(num_carrier,num_data);%pilot_index:预先计算好的导频符号位置索引%modulated_pilot:之前已生成的导频符号(QPSK调制后的值)%repmat(modulated_pilot,1,num_pilot):%   modulated_pilot的原始大小是 (num_carrier × 1),即每个子载波一个导频符号%   repmat(..., 1, num_pilot):对所有子载波上的导频符号进行重复,复制 num_pilot 次,使其适应 data_Tx 的列索引维度data_Tx(:,pilot_index) = repmat(modulated_pilot,1,num_pilot);%插入数据信号(Bit)%modulated_Bit:之前已生成的数据符号(QPSK调制后的值)%reshape(modulated_Bit, num_carrier, num_symbol):%   modulated_Bit是一个一维向量,大小为(1 × num_carrier × num_symbol)%   reshape(..., num_carrier, num_symbol):将其重新排列为二维矩阵,每一列对应一个完整的OFDM符号(num_carrier 个子载波)data_Tx(:,bit_index) = reshape(modulated_Bit,num_carrier,num_symbol);%-----------IFFT-----------%IFFT:频域到时域转换%ifft(data_Tx)%   data_Tx 是频域信号,大小为 (num_carrier × num_data),表示在每个子载波上加载的符号信息(包括数据符号和导频)%   ifft(...) 进行 逆离散傅立叶变换(IDFT),将 OFDM 频域信号转换为时域信号%   由于IFFT输出的时域信号功率通常会比频域信号小(因为能量均摊到多个子载波上),所以乘以 sqrt(num_carrier) 进行功率归一化,保证时域信号的平均功率不变time_signal = sqrt(num_carrier)*ifft(data_Tx);%-----------循环前缀-----------%time_signal(num_carrier-Guard+1:num_carrier,:):%   取OFDM符号的最后Guard个样本作为循环前缀(从 num_carrier - Guard + 1 到 num_carrier)%[time_signal(num_carrier-Guard+1:num_carrier,:); time_signal]:%    MATLAB 中的矩阵拼接操作,表示将选取的循环前缀部分和完整的OFDM符号拼接在一起,形成带有循环前缀的信号%add_cyclic_signal形状为(num_carrier + Guard) × num_data%   每一行是一个子载波的时域样本%   每一列是一个完整的OFDM符号add_cyclic_signal = [time_signal(num_carrier-Guard+1:num_carrier,:);time_signal];%-----------并串变换-----------%OFDM发送端是并行处理的%Tx_data_trans大小为:【1,(num_carrier + Guard) × num_data】Tx_data_trans = reshape(add_cyclic_signal,1,(num_carrier+Guard)*num_data);%-----------awgn信道-----------%将信号 Tx_data_trans通过加性高斯白噪声信道(AWGN) 进行传输,模拟无线信道的噪声影响%SNR(snr_index):当前信噪比(Signal-to-Noise Ratio, SNR),即信号功率与噪声功率的比值,影响接收信号质量%'measured':表明 MATLAB 会根据 Tx_data_trans 信号的功率 自动调整噪声功率,使得信噪比准确Rx_data = awgn(Tx_data_trans,SNR(snr_index),'measured');%-----------串并变换-----------%将串行信号恢复为(num_carrier + Guard) × num_dataRx_data_trans = reshape(Rx_data,num_carrier+Guard,num_data);%-----------去除循环前缀-----------%由于多径效应,信号在接收端可能会受到前一个符号的干扰(ISI),循环前缀的作用是消除多径效应,确保FFT变换时不会受到符号间干扰%去除循环前缀后的大小为num_carrier × num_dataRx_signal = Rx_data_trans(Guard+1:end,:);%-----------FFT-----------%fft(Rx_signal):执行快速傅里叶变换(FFT),将时域信号转换回频域信号%/sqrt(num_carrier):归一化 FFT 变换的输出,以确保功率与发送端匹配%data_Rx大小为num_carrier × num_datadata_Rx = fft(Rx_signal)/sqrt(num_carrier);%-----------提取导频,提取bit流-----------%modulated_pilot_Rx = data_Rx(:, pilot_index);%   提取 接收端的导频符号,用于后续信道估计%   data_Rx 是 (num_carrier × num_data) 矩阵,每列是一个 OFDM 符号,每行是不同子载波的数据%   data_Rx(:, pilot_index) 选取导频索引对应的列,得到导频信号矩阵modulated_pilot_Rx = data_Rx(:,pilot_index);%   提取接收端的数据符号,用于后续解调和误码率计算modulated_Bit_Rx = data_Rx(:,bit_index);%-----------LS信道估计-----------%modulated_pilot_Rx:接收端的导频符号%modulated_pilot:发送端的导频符号%repmat(modulated_pilot, 1, num_pilot):将发送端的导频符号modulated_pilot重复num_pilot次,使其与modulated_pilot_Rx的维度匹配%H_ls:LS信道估计值,它是通过接收到的导频符号与发送端已知的导频符号的比值计算得到的H_ls = modulated_pilot_Rx./repmat(modulated_pilot,1,num_pilot);%进一步根据导频的估计值,利用插值法进行信道估计%pilot_index:导频符号的位置%H_ls(i, 1:num_pilot):提取出第i个子载波上的导频符号的LS信道估计值%interp1(pilot_index, H_ls(i, 1:num_pilot), 1:num_data, 'spline'):使用spline插值方法根据导频符号的位置,对信道进行插值,估计出完整数据符号的信道响应%channel_H_ls(i, :):得到第i个子载波的信道估计(OFDM帧中总的符号数=数据符号+导频)for i = 1:num_carrierchannel_H_ls(i,:)=interp1(pilot_index,H_ls(i,1:num_pilot),1:num_data,'spline');end%bit_index:数据符号的位置%channel_H_ls(:, bit_index):提取数据符号对应的信道增益channel_bit_H_ls = channel_H_ls(:,bit_index);%计算通过"LS信道估计"得到的原始比特流x%modulated_Bit_Rx:接收到的数据符号%conj(channel_bit_H_ls):信道估计的共轭复数%abs(channel_bit_H_ls).^2:信道增益的平方,用于归一化Rx_bit_esti_ls = modulated_Bit_Rx.*conj(channel_bit_H_ls)./(abs(channel_bit_H_ls).^2);%-----------LMMSE信道估计-----------%QPSK调制的参数,通常表示信号的功率beta = 1;%指系统的 时间相关性常数,用于描述信道的时间变化特性。在LMMSE中,常常使用这个值来表示信道的时间延迟或者衰减特性trms = 1e-6;%信道延迟的最大时间,这个值用于计算信道相关矩阵t_max = 8;%子载波数量N = num_carrier;%初始化一个N×N 的零矩阵,后面用来存储信道相关矩阵Rhh = zeros(N,N);%计算 信道的相关矩阵for i = 1:Nfor j = 1:NRhh(i,j) = (1-exp((-1)*t_max*((1/trms)+1i*2*pi*(i-1)/N)))./(trms*(1-exp((-1)*t_max/trms))*((1/trms)+1i*2*pi*(i-1)/N));endend%计算权重向量WW = Rhh*(eye(N)/(Rhh+(beta/SNR(snr_index)*eye(N))));%LMMSE估计中的权重矩阵H_lmmse = W*H_ls;%计算通过LMMSE信道估计得到的bit流估计值for i = 1:num_carrierchannel_H_lmmse(i,:)=interp1(pilot_index,H_lmmse(i,1:num_pilot),1:num_data,'linear');end%数据符号对应的信道增益channel_bit_H_lmmse = channel_H_lmmse(:,bit_index);%计算通过"LMMSE信道估计"得到的原始比特流Rx_bit_esti_lmmse = modulated_Bit_Rx.*conj(channel_bit_H_lmmse)./(abs(channel_bit_H_lmmse).^2);%-----------解调-----------%qamdemod:该函数用于对接收到的符号进行 QAM 解调%Rx_bit_esti_ls和Rx_bit_esti_lmmse 分别是通过LS (最小二乘法)和LMMSE(线性最小均方误差)信道估计得到的符号估计结果%modulation_mode表示所使用的调制方式%Rx_bit_esti_ls(:).'和Rx_bit_esti_lmmse(:).'是将接收的符号向量进行转置处理(从列向量变为行向量),这样可以满足qamdemod的输入要求demod_ls = qamdemod(Rx_bit_esti_ls(:).',modulation_mode);demod_lmmse = qamdemod(Rx_bit_esti_lmmse(:).',modulation_mode);%误码率计算%demod_ls(i)是通过LS信道估计解调后的第i个比特,Bit_Tx(i)是发送端第i个比特%如果解调后的比特和发送的比特不一致(即发生了误码),就将 LS 估计的误码数 (num_bit_err_ls) 增加 1for i = 1:length(Bit_Tx)if demod_ls(i)~=Bit_Tx(i)num_bit_err_ls(snr_index,epoch) = num_bit_err_ls(snr_index,epoch)+1;endif demod_lmmse(i)~=Bit_Tx(i)num_bit_err_lmmse(snr_index,epoch) = num_bit_err_lmmse(snr_index,epoch)+1;endendend
end
%%%%%%%%%%%%%%%%%%%%%%作图分析%%%%%%%%%%%%%%%%%%%
BER_ls = mean(num_bit_err_ls.')/length(Bit_Tx);
BER_lmmse = mean(num_bit_err_lmmse.')/length(Bit_Tx);figure
plot(SNR,BER_ls,'-r+',SNR,BER_lmmse,'-b*');
legend('LS','LMMSE');
title('OFDM系统LS信道估计和LMMSE信道估计比较');
xlabel('SNR');
ylabel('BER');

结果分析:
在这里插入图片描述
BER-SNR曲线趋势:

  • LS估计:在高SNR时性能接近LMMSE,但在低SNR时误码率(BER)显著高于LMMSE。

  • LMMSE估计:在低SNR时通过噪声抑制和信道统计信息利用,BER性能明显优于LS;随着SNR升高,优势逐渐减小。

性能差异原因:

  • LS估计:仅利用导频点直接除法估计信道,未考虑噪声和信道相关性,对噪声敏感。

  • LMMSE估计:通过信道相关矩阵 R H H R_{H H} RHH 和SNR自适应加权,抑制了噪声影响

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

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

相关文章

C++ strcpy和strcat讲解

目录 一. strcpy 代码演示: 二.strcat 代码演示: 一. strcpy 使⽤字符数组可以存放字符串,但是字符数组能否直接赋值呢? ⽐如: char arr1[] "abcdef"; char arr2[20] {0}; arr2 arr1;//这样这节赋值可…

力扣257. 二叉树的所有路径(遍历思想解决)

Problem: 257. 二叉树的所有路径 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的先序遍历) 利用先序遍历的思想,我门用一个List变量path记录当前先序遍历的节点,当遍历到根节点时,将其添加到另一个List变量res中&…

JVM运行时数据区域-附面试题

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 依赖用户线程的启动和结束而建立和销毁。 1. 程序计…

向上调整算法(详解)c++

算法流程: 与⽗结点的权值作⽐较,如果⽐它⼤,就与⽗亲交换; 交换完之后,重复 1 操作,直到⽐⽗亲⼩,或者换到根节点的位置 这里为什么插入85完后合法? 我们插入一个85,…

数据库备份、主从、集群等配置

数据库备份、主从、集群等配置 1 MySQL1.1 docker安装MySQL1.2 主从复制1.2.1 主节点配置1.2.2 从节点配置1.2.3 创建用于主从同步的用户1.2.4 开启主从同步1.2.4 主从同步验证 1.3 主从切换1.3.1 主节点设置只读(在192.168.1.151上操作)1.3.2 检查主从数…

【题解】AtCoder Beginner Contest ABC391 D Gravity

题目大意 原题面链接 在一个 1 0 9 W 10^9\times W 109W 的平面里有 N N N 个方块。我们用 ( x , y ) (x,y) (x,y) 表示第 x x x 列从下往上数的 y y y 个位置。第 i i i 个方块的位置是 ( x i , y i ) (x_i,y_i) (xi​,yi​)。现在执行无数次操作,每一次…

FFmpeg工具使用基础

一、FFmpeg工具介绍 FFmpeg命令行工具主要包括以下几个部分: ‌ffmpeg‌:编解码工具‌ffprobe‌:多媒体分析器‌ffplay‌:简单的音视频播放器这些工具共同构成了FFmpeg的核心功能,支持各种音视频格式的处理和转换‌ 二、在Ubuntu18.04上安装FFmpeg工具 1、sudo apt-upda…

自制虚拟机(C/C++)(二、分析引导扇区,虚拟机读二进制文件img软盘)

先修复上一次的bug&#xff0c;添加新指令&#xff0c;并增加图形界面 #include <graphics.h> #include <conio.h> #include <windows.h> #include <commdlg.h> #include <iostream> #include <fstream> #include <sstream> #inclu…

LeetCode:63. 不同路径 II

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;63. 不同路径 II 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]…

索引的底层数据结构、B+树的结构、为什么InnoDB使用B+树而不是B树呢

索引的底层数据结构 MySQL中常用的是Hash索引和B树索引 Hash索引&#xff1a;基于哈希表实现的&#xff0c;查找速度非常快&#xff0c;但是由于哈希表的特性&#xff0c;不支持范围查找和排序&#xff0c;在MySQL中支持的哈希索引是自适应的&#xff0c;不能手动创建 B树的…

EigenLayer联合Cartesi:打造面向主流用户的DeFi、AI等新用例

EigenLayer 与 Cartesi 正在开展合作&#xff0c;致力于弥合基础设施协议与终端用户应用之间的鸿沟&#xff1b;鼓励核心开发人员构建人工智能代理、复杂 DeFi、游戏、社交网络等应用场景&#xff1b;得益于 Cartesi 基于 Linux 的协处理器&#xff0c;开发者可复用现有软件库和…

DeepSeek-R1论文研读:通过强化学习激励LLM中的推理能力

DeepSeek在朋友圈&#xff0c;媒体&#xff0c;霸屏了好长时间&#xff0c;春节期间&#xff0c;研读一下论文算是时下的回应。论文原址&#xff1a;[2501.12948] DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 摘要&#xff1a; 我们…

MINIRAG: TOWARDS EXTREMELY SIMPLE RETRIEVAL-AUGMENTED GENERATION论文翻译

感谢阅读 注意不含评估以后的翻译原论文地址标题以及摘要介绍部分MiniRAG 框架2.1 HETEROGENEOUS GRAPH INDEXING WITH SMALL LANGUAGE MODELS2.2 LIGHTWEIGHT GRAPH-BASED KNOWLEDGE RETRIEVAL2.2.1 QUERY SEMANTIC MAPPING2.2.2 TOPOLOGY-ENHANCED GRAPH RETRIEVAL 注意不含评…

Kafka中文文档

文章来源&#xff1a;https://kafka.cadn.net.cn 什么是事件流式处理&#xff1f; 事件流是人体中枢神经系统的数字等价物。它是 为“永远在线”的世界奠定技术基础&#xff0c;在这个世界里&#xff0c;企业越来越多地使用软件定义 和 automated&#xff0c;而软件的用户更…

【学习笔记】深度学习网络-正则化方法

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程&#xff0c;深度学习领域研究生必读教材),开始深度学习领域学习&#xff0c;深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中用…

Flutter常用Widget小部件

小部件Widget是一个类&#xff0c;按照继承方式&#xff0c;分为无状态的StatelessWidget和有状态的StatefulWidget。 这里先创建一个简单的无状态的Text小部件。 Text文本Widget 文件&#xff1a;lib/app/app.dart。 import package:flutter/material.dart;class App exte…

浅色可视化大屏虽然经常被诟病,也有自己的用武之地呀

一、视觉舒适性与减轻疲劳 在长时间的使用和观察中&#xff0c;浅色可视化大屏能够为用户带来更舒适的视觉体验&#xff0c;减轻视觉疲劳。与深色背景相比&#xff0c;浅色背景通常反射的光线较少&#xff0c;对眼睛的刺激相对较小。尤其是在需要长时间盯着大屏进行数据分析…

Office / WPS 公式、Mathtype 公式输入花体字、空心字

注&#xff1a;引文主要看注意事项。 1、Office / WPS 公式中字体转换 花体字 字体选择 “Eulid Math One” 空心字 字体选择 “Eulid Math Two” 使用空心字时&#xff0c;一般不用斜体&#xff0c;取消勾选 “斜体”。 2、Mathtype 公式输入花体字、空心字 2.1 直接输…

el-table组件样式如何二次修改?

文章目录 前言一、去除全选框按钮样式二、表头颜色的修改 前言 ElementUI中的组件el-table表格组件提供了丰富的样式&#xff0c;有一个全选框的el-table组件&#xff0c;提供了全选框和多选。 一、去除全选框按钮样式 原本默认是有全选框的。假如有一些开发者&#xff0c;因…

Python安居客二手小区数据爬取(2025年)

目录 2025年安居客二手小区数据爬取观察目标网页观察详情页数据准备工作&#xff1a;安装装备就像打游戏代码详解&#xff1a;每行代码都是你的小兵完整代码大放送爬取结果 2025年安居客二手小区数据爬取 这段时间需要爬取安居客二手小区数据&#xff0c;看了一下相关教程基本…