matlab-双树复小波变换DTCWT(转自 MathWorks)

此示例展示了双树复小波变换 (DTCWT) 如何在信号、图像和体积处理方面提供优于临界采样 DWT 的优势。DTCWT 作为两个独立的双通道滤波器组来实现。为了获得本示例中描述的优点,您不能任意选择两个树中使用的缩放和小波滤波器。一棵树的低通(缩放)和高通(小波)滤波器,{H0,H1},必须生成一个缩放函数和小波,它们是由另一棵树的低通和高通滤波器生成的缩放函数和小波的近似希尔伯特变换,{G0,G1}。因此,由两棵树形成的复值标度函数和小波是近似解析的。因此,与只有2d冗余系数d- 维度数据。DTCWT 中的冗余明显小于未抽取(固定)DWT 中的冗余。该示例说明了 DTCWT 的近似平移不变性、2-D 和 3-D 中双树分析小波的选择性方向,以及双树复离散小波变换在图像和体积去噪中的使用。

DTCWT 的近移不变性

DWT 会受到偏移方差的影响,这意味着输入信号或图像中的微小偏移可能会导致 DWT 系数中信号/图像能量跨尺度的分布发生显着变化。DTCWT 近似是平移不变的。

为了在测试信号上证明这一点,构建两个长度为 128 个样本的移位离散时间脉冲。一个信号在样本 60 处具有单位脉冲,而另一个信号在样本 64 处具有单位脉冲。两个信号显然都具有单位能量(l^2 norm))。

kronDelta1 = zeros(128,1);
kronDelta1(60) = 1;
kronDelta2 = zeros(128,1);
kronDelta2(64) = 1;

设置DWT扩展模式为周期。使用长度为 14 的小波和缩放滤波器获取两个信号低至 3 级的 DWT 和 DTCWT。提取 3 级细节系数进行比较。

origmode = dwtmode('status','nodisplay');
dwtmode('per','nodisp')
J = 3;
[dwt1C,dwt1L] = wavedec(kronDelta1,J,'sym7');
[dwt2C,dwt2L] = wavedec(kronDelta2,J,'sym7');
dwt1Cfs = detcoef(dwt1C,dwt1L,3);
dwt2Cfs = detcoef(dwt2C,dwt2L,3);[dt1A,dt1D] = dualtree(kronDelta1,'Level',J,'FilterLength',14);
[dt2A,dt2D] = dualtree(kronDelta2,'Level',J,'FilterLength',14);
dt1Cfs = dt1D{3};
dt2Cfs = dt2D{3};

绘制第 3 级两个信号的 DWT 和 DTCWT 系数的绝对值,并计算能量(平方2范数)的系数。在相同比例上绘制系数。信号中的四个样本移位导致了 3 级 DWT 系数的能量发生显着变化。3 级 DTCWT 系数中的能量仅改变了约 3%。

figure
tiledlayout(1,2)
nexttile
stem(abs(dwt1Cfs),'markerfacecolor',[0 0 1])
title({'DWT';['Squared 2-norm = ' num2str(norm(dwt1Cfs,2)^2,3)]},...'fontsize',10)
ylim([0 0.4])
nexttile
stem(abs(dwt2Cfs),'markerfacecolor',[0 0 1])
title({'DWT';['Squared 2-norm = ' num2str(norm(dwt2Cfs,2)^2,3)]},...'fontsize',10)
ylim([0 0.4])

figure
tiledlayout(1,2)
nexttile
stem(abs(dt1Cfs),'markerfacecolor',[0 0 1])
title({'Dual-tree CWT';['Squared 2-norm = ' num2str(norm(dt1Cfs,2)^2,3)]},...'fontsize',10)
ylim([0 0.4])
nexttile
stem(abs(dwt2Cfs),'markerfacecolor',[0 0 1])
title({'Dual-tree CWT';['Squared 2-norm = ' num2str(norm(dt2Cfs,2)^2,3)]},...'fontsize',10)
ylim([0 0.4])

 

 为了证明近似平移不变性在实际数据中的实用性,我们分析了心电图 (ECG) 信号。ECG 信号的采样间隔为 1/180 秒。数据取自 Percival & Walden [3],第 125 页(数据最初由华盛顿大学的 William Constantine 和 Per Reinhall 提供)。为了方便起见,我们将数据从 t=0 开始。

load wecg
dt = 1/180;
t = 0:dt:(length(wecg)*dt)-dt;
figure
plot(t,wecg)
xlabel('Seconds')
ylabel('Millivolts')

 相距约 0.7 秒的大正峰值是心律的 R 波。首先,使用临界采样 DWT 和 Farras 近对称滤波器分解信号。绘制原始信号以及 2 级和 3 级小波系数。选择 2 级和 3 级系数是因为在给定采样率的这些尺度中 R 波被最显着地隔离。

figure
J = 6; 
[df,rf] = dtfilters('farras');
[dtDWT1,L1] = wavedec(wecg,J,df(:,1),df(:,2));
details = zeros(2048,3);
details(2:4:end,2) = detcoef(dtDWT1,L1,2);
details(4:8:end,3) = detcoef(dtDWT1,L1,3);
tiledlayout(3,1)
nexttile
stem(t,details(:,2),'Marker','none','ShowBaseline','off')
title('Level 2')
ylabel('mV')
nexttile
stem(t,details(:,3),'Marker','none','ShowBaseline','off')
title('Level 3')
ylabel('mV')
nexttile
plot(t,wecg)
title('Original Signal')
xlabel('Seconds')
ylabel('mV')

对二叉树变换重复上述分析。在这种情况下,只需绘制第 2 层和第 3 层双树系数的实部。

[dtcplxA,dtcplxD] = dualtree(wecg,'Level',J,'FilterLength',14);
details = zeros(2048,3);
details(2:4:end,2) = dtcplxD{2};
details(4:8:end,3) = dtcplxD{3};
tiledlayout(3,1)
nexttile
stem(t,real(details(:,2)),'Marker','none','ShowBaseline','off')
title('Level 2')
ylabel('mV')
nexttile
stem(t,real(details(:,3)),'Marker','none','ShowBaseline','off')
title('Level 3')
ylabel('mV')
nexttile
plot(t,wecg)
title('Original Signal')
xlabel('Seconds')
ylabel('mV')

临界采样和双树小波变换都将 ECG 波形的重要特征定位到相似的尺度

小波在一维信号中的一个重要应用是获得按尺度的方差分析。按理说,这种方差分析应该对输入信号的循环移位不敏感。不幸的是,临界采样 DWT 的情况并非如此。为了证明这一点,我们将 ECG 信号循环平移 4 个样本,使用临界采样 DWT 分析未平移和平移的信号,并计算跨尺度的能量分布。

 

wecgShift = circshift(wecg,4);
[dtDWT2,L2] = wavedec(wecgShift,J,df(:,1),df(:,2));detCfs1 = detcoef(dtDWT1,L1,1:J,'cells');
apxCfs1 = appcoef(dtDWT1,L1,rf(:,1),rf(:,2),J);
cfs1 = horzcat(detCfs1,{apxCfs1});
detCfs2 = detcoef(dtDWT2,L2,1:J,'cells');
apxCfs2 = appcoef(dtDWT2,L2,rf(:,1),rf(:,2),J);
cfs2 = horzcat(detCfs2,{apxCfs2});sigenrgy = norm(wecg,2)^2;
enr1 = cell2mat(cellfun(@(x)(norm(x,2)^2/sigenrgy)*100,cfs1,'uni',0));
enr2 = cell2mat(cellfun(@(x)(norm(x,2)^2/sigenrgy)*100,cfs2,'uni',0));
levels = {'D1';'D2';'D3';'D4';'D5';'D6';'A6'};
enr1 = enr1(:);
enr2 = enr2(:);
table(levels,enr1,enr2,'VariableNames',{'Level','enr1','enr2'})

 请注意,第 3 级和第 4 级的小波系数显示原始信号和移位信号之间的能量变化约为 3%。接下来,我们使用复杂的双树离散小波变换重复此分析。

[dtcplx2A,dtcplx2D] = dualtree(wecgShift,'Level',J,'FilterLength',14);
dtCfs1 = vertcat(dtcplxD,{dtcplxA});
dtCfs2 = vertcat(dtcplx2D,{dtcplx2A});dtenr1 = cell2mat(cellfun(@(x)(norm(x,2)^2/sigenrgy)*100,dtCfs1,'uni',0));
dtenr2 = cell2mat(cellfun(@(x)(norm(x,2)^2/sigenrgy)*100,dtCfs2,'uni',0));
dtenr1 = dtenr1(:);
dtenr2 = dtenr2(:);
table(levels,dtenr1,dtenr2, 'VariableNames',{'Level','dtenr1','dtenr2'})

双树变换对原始信号及其循环移位版本按比例产生一致的方差分析。

图像处理中的方向选择性

二维 DWT 的标准实现使用图像的列和行的可分离过滤。使用辅助函数helperPlotCritSampDWT绘制具有 4 个消失矩的 Daubechies 最小不对称相位小波的 LH、HL 和 HH 小波sym4。\

 helperPlotCritSampDWT

 

请注意,LH 和 HL 小波分别具有清晰的水平和垂直方向。然而,最右侧的 HH 小波混合了 +45 度和 -45 度方向,产生了棋盘伪影。这种方向的混合是由于使用了实值可分离滤波器。HH 实值可分离滤波器在 2-D 频率平面的所有四个高频角都有通带。

双树 DWT 通过使用近似解析的小波来实现方向选择性,这意味着它们仅在频率轴的一半上有支持。在双树 DWT 中,实部和虚部都有六个子带。六个实部是通过将两棵树中的输入图像的列过滤的输出和随后的行过滤相加而形成的。六个虚部是通过减去列滤波和行滤波的输出而形成的。

应用于列和行的过滤器可以来自同一过滤器对,{H0,H1}或者{G0,G1},或来自不同的滤波器对,{H0,G1} , {G0,H1}。使用辅助函数helperPlotWaveletDTCWT绘制与 DTCWT 实部和虚部相对应的 12 个小波的方向。上图的第一行显示了六个小波的实部,第二行显示了虚部。

helperPlotWaveletDTCWT

二维边缘表示

复杂双树小波的近似解析性和选择性方向在图像边缘表示方面提供了优于标准二维 DWT 的性能。为了说明这一点,我们使用临界采样的二维 DWT 和二维复数定向双树变换来分析边缘由多个方向上的直线和曲线奇点组成的测试图像。首先,分析由线奇点组成的八边形图像。

load woctagon
imagesc(woctagon)
colormap gray
title('Original Image')
axis equal
axis off

使用辅助函数helperPlotOctagon将图像分解为第 4 级,并根据第 4 级细节系数重建图像近似值。

helperPlotOctagon(woctagon)

 接下来,分析具有双曲边的八边形。双曲八边形中的边是曲线奇点。

load woctagonHyperbolic
figure
imagesc(woctagonHyperbolic)
colormap gray
title('Octagon with Hyperbolic Edges')
axis equal
axis off

 再次,使用辅助函数helperPlotOctagon将图像分解为第 4 级,并基于标准 2-D DWT 和面向复杂的双树 DWT 的第 4 级细节系数重建图像近似值。

helperPlotOctagon(woctagonHyperbolic)



请注意,二维临界采样 DWT 中明显的振铃伪影在两幅图像的 2-D DTCWT 中都不存在。DTCWT 更忠实地再现直线和曲线奇点。

图像去噪

由于能够在单独的子带中隔离不同的方向,因此在图像去噪等应用中,DTCWT 通常能够优于标准的可分离 DWT。为了演示这一点,请使用辅助函数helperCompare2DDenoisingDTCWT。辅助函数加载图像并添加零均值高斯白噪声σ = 25。对于用户提供的阈值范围,该函数会比较使用软阈值处理的临界采样 DWT 和 DTCWT 的去噪效果。对于每个阈值,都会显示均方根 (RMS) 误差和峰值信噪比 (PSNR)。

numex = 3;
helperCompare2DDenoisingDTCWT(numex,0:2:100,'PlotMetrics');

DTCWT 在 RMS 误差和 PSNR 方面优于标准 DWT。

接下来,获取阈值为 25 的去噪图像,该阈值等于加性噪声的标准差。

numex = 3;
helperCompare2DDenoisingDTCWT(numex,25,'PlotImage');

由于阈值等于加性噪声的标准偏差,DTCWT 提供的 PSNR 比标准 2-D DWT 高出近 4 dB

3D 方向选择性

当将小波分析扩展到更高维度时,在二维中使用可分离 DWT 观察到的振铃伪影会加剧。DTCWT 使您能够以最小的冗余保持 3-D 方向选择性。在 3-D 中,双树变换中有 28 个小波子带。

为了演示 3-D 双树小波变换的方向选择性,可视化 3-D 双树和可分离 DWT 小波的 3-D 等值面示例。首先,分别可视化两个双树子带的实部和虚部。

helperVisualize3D('Dual-Tree',28,'separate')

 

helperVisualize3D('Dual-Tree',25,'separate')

等值面图的红色部分表示小波从零开始的正偏移,而蓝色部分表示负偏移。您可以清楚地看到双树小波的实部和虚部在空间中的方向选择性。现在可视化双树子带之一,将实图和虚图绘制在一起作为一个等值面。

helperVisualize3D('Dual-Tree',25,'real-imaginary')

 

 上图表明实部和虚部在空间中是彼此移动的版本。这反映了复小波的虚部是实部的近似希尔伯特变换。接下来,以 3 维形式可视化真实正交小波的等值面以进行比较。

helperVisualize3D( 'DWT' ,7)

 

在 2-D DWT 中观察到的方向混合在 3-D 中甚至更加明显。正如 2-D 情况一样,3-D 方向的混合会导致明显的振铃或块效应。为了证明这一点,请检查球形体积的 3-D DWT 和 DTCWT 小波细节。球体尺寸为 64 x 64 x 64。

 

load sphr
[A,D] = dualtree3(sphr,2,'excludeL1');
A = zeros(size(A));
sphrDTCWT = idualtree3(A,D);
I = imtile(rescale(reshape(sphrDTCWT,[64 64 1 64])),GridSize=[8 8]);
imshow(I)
title('DTCWT Level 2 Details')

将前面的图与基于可分离 DWT 的第二级详细信息进行比较。 

sphrDEC = wavedec3(sphr,2,'sym4','mode','per');
sphrDEC.dec{1} = zeros(size(sphrDEC.dec{1}));
for kk = 2:8sphrDEC.dec{kk} = zeros(size(sphrDEC.dec{kk}));
end
sphrrecDWT = waverec3(sphrDEC);
figure
I = imtile(rescale(reshape(sphrrecDWT,[64 64 1 64])),GridSize=[8 8]);
imshow(I)
title('DWT Level 2 Details')

放大 DTCWT 和 DWT 蒙太奇中的图像,您将看到与 DTCWT 相比,DWT 细节中的块伪影有多么突出。

体积去噪

与 2-D 情况类似,3-D DTCWT 的方向选择性通常会导致体积去噪的改进。

为了证明这一点,请考虑由 16 个切片组成的 MRI 数据集。标准差为10的高斯噪声已添加到原始数据集中。显示噪声数据集。

load MRI3D
I = imtile(rescale(reshape(noisyMRI,[128 128 1 16])),GridSize=[4 4]);
imshow(I)

请注意,去噪之前的原始 SNR 约为 11 dB。

20*log10(norm(origMRI(:),2)/norm(origMRI(:)-noisyMRI(:),2))
答案=11.2997

使用 DTCWT 和 DWT 将 MRI 数据集去噪至 4 级。两种情况都使用类似的小波滤波器长度。将得到的 SNR 绘制为阈值的函数。显示在最佳 SNR 下获得的 DTCWT 和 DWT 的去噪结果。

[imrecDTCWT,imrecDWT] = helperCompare3DDenoising(origMRI,noisyMRI);

 

figure
I = imtile(rescale(reshape(imrecDTCWT,[128 128 1 16])),GridSize=[4 4]);
imshow(I)
title('DTCWT Denoised Volume')

figure
I = imtile(rescale(reshape(imrecDWT,[128 128 1 16])),GridSize=[4 4]);
imshow(I)
title('DWT Denoised Volume')

 

 恢复原来的扩展模式。

dwtmode(origmode,'nodisplay')

概括

我们已经证明,双树 CWT 具有临界采样 DWT 无法实现的近平移不变性和方向选择性的理想特性。我们已经演示了这些属性如何提高信号分析、图像和体积中的边缘表示以及图像和体积去噪的性能。

参考

  1. 陈惠中和 N.金斯伯里。“非刚性 3D 实体的高效配准。” IEEE 图像处理汇刊21,no。1(2012 年 1 月):262–72。https://doi.org/10.1109/TIP.2011.2160958。

  2. 金斯伯里、尼克. “用于平移不变分析和信号滤波的复小波。” 应用和计算谐波分析10,编号。3(2001 年 5 月):234-53。https://doi.org/10.1006/acha.2000.0343。

  3. 唐纳德·B·珀西瓦尔 (Percival) 和安德鲁·T·瓦尔登 (Andrew T. Walden)。时间序列分析的小波方法。剑桥统计与概率数学系列。剑桥;纽约:剑桥大学出版社,2000 年。

  4. Selesnick、IW、RG Baraniuk 和 NC Kingsbury。“双树复小波变换。” IEEE 信号处理杂志 22,no。6(2005 年 11 月):123-51。https://doi.org/10.1109/MSP.2005.1550194。

  5. Selesnick, I.“双密度 DWT”。信号和图像分析中的小波:从理论到实践(AA Petrosian 和 FG Meyer 编辑)。马萨诸塞州诺威尔:Kluwer 学术出版社,2001 年,第 39-66 页。

  6. Selesnick,IW“双密度双树 DWT”。IEEE 信号处理汇刊52,no。5(2004 年 5 月):1304–14。https://doi.org/10.1109/TSP.2004.826174。

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

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

相关文章

3.25 ARM day8

1.自己设置温度湿度阈值&#xff0c;当温度过高时&#xff0c;打开风扇&#xff0c;蜂鸣器报警 2.当湿度比较高时&#xff0c;打开LED1灯&#xff0c;蜂鸣器报警 bee.c #include"bee.h" void bee_init() {RCC->MP_AHB4ENSETR | (0x1<<1);GPIOB->MODE…

Github多账号共存

在开发阶段&#xff0c;如果同时拥有多个开源代码托管平台的账户&#xff0c;在代码的管理上非常麻烦。那么&#xff0c;如果同一台机器上需要配置多个账户&#xff0c;怎样才能确保不冲突&#xff0c;不同账户独立下载独立提交呢&#xff1f; 我们以两个github账号进行演示 …

【工作中问题解决实践 十三】线上JVM参数该如何配置

在线上部署Java应用时&#xff0c;可以通过Java虚拟机&#xff08;JVM&#xff09;的参数来控制内存的分配和管理。 常见的JVM配置参数 以下是一些常见的JVM内存参数&#xff1a; -Xms&#xff1a; 设置JVM的初始堆大小。 重点关注-Xmx&#xff1a; 设置JVM的最大堆大小。 重…

docker desktop启动Kibana:No living connections, Error: No Living connections

Kibana启动之后一直报Kibana server is not ready yet 查看日志&#xff1a;No living connections, Error: No Living connections,连接ES失败&#xff01; 查看配置文件内容 /usr/share/kibana/config/kibana.yml 经过一系列查找资料和尝试之后&#xff0c;亲测以下方法可用…

阿里二面:谈谈ThreadLocal的内存泄漏问题?问麻了。。。。

引言 ThreadLocal在Java多线程编程中扮演着重要的角色&#xff0c;它提供了一种线程局部存储机制&#xff0c;允许每个线程拥有独立的变量副本&#xff0c;从而有效地避免了线程间的数据共享冲突。ThreadLocal的主要用途在于&#xff0c;当需要为每个线程维护一个独立的上下文…

字节算法岗二面,凉凉。。。

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

华为OD技术面算法题整理

LeetCode原题 简单 题目编号频次409. 最长回文串 - 力扣(LeetCode)3

JSONObject优雅获取深层字段属性值

开篇说明 如果在这里获得过启发和思考&#xff0c;希望点赞支持&#xff01;对于内容有不同的看法欢迎来信交流。 技术栈 >> java 邮箱 >> 15673219519163.com 描述介绍 根据JSONObject中字段的名称,优雅获取深层属性值 使用示例,取error_entry的数量。JSON的层…

分治归并问题

“别让自我被拯救~” 谈谈归并与分治 当我们首次接触排序算法时&#xff0c;一定对所谓 "归并"方式排序的算法感到头疼~ 因为&#xff0c;我们难以形象出其不断 "分离"时&#xff0c;各个区域的状态。然而&#xff0c;即便 "归并"排序算法的学习…

新能源汽车充电桩消防安全视频智能可视化监管建设方案

一、方案背景 据应急管理部门统计公布的数据显示&#xff0c;仅2023年第一季度&#xff0c;新能源汽车自燃率就上涨了32%&#xff0c;平均每天就有8辆新能源汽车发生火灾&#xff08;含自燃&#xff09;。在已查明起火原因中&#xff0c;58%源于电池问题&#xff0c;19%源于碰…

输出当前时间

用途&#xff1a;在项目中一些属性中设置当前时间 实例代码 import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class time {public static void main(String[] args){LocalDateTime china LocalDateTime.now(); DateTimeFormatter forma…

ASPICE学习笔记 ———— 过程模型(Process reference model)

文章目录 介绍过程模型Primary life cycle processes categoryAcquisition Process GroupSupply Process GroupSystem Engineering Processes GroupSoftware Engineering Processes Group Supporting life cycle processes categoryOrganizational life cycle processes catego…

动态规划算法入门

动态规划算法入门 动态规划(Dynamic Programming, DP)是一种常用的算法设计技术,它通过将原问题分解为相对简单的子问题,并存储子问题的解来避免重复计算,最终获得原问题的最优解。本文将通过实例来介绍动态规划的基本原理和思路。 一、动态规划的基本思想 动态规划的基本思…

【活动预告】本周四(3月28日)AI算法大模型备案线上活动

Al算法备案中心特邀十年合规专家「乐歌」&#xff0c;于本周四进行线上算法备案活动 支持AI创业者&#xff0c;免费咨询算法备案 3.28日20&#xff1a;00腾讯会议欢迎参与&#xff01; 扫码添加活动助理报名参加&#xff01;

c语音函数大全(T开头)

c语音函数大全(T开头) There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should leave quickly. 函数名…

四川宏博蓬达法律咨询有限公司:您身边的法律守护者

在快节奏的现代生活中&#xff0c;法律咨询服务已成为人们不可或缺的一部分。四川宏博蓬达法律咨询有限公司正是这样一个值得您信赖的法律服务伙伴。我们专注于为客户提供专业、高效、安全的法律服务&#xff0c;致力于成为您生活中的法律守护者。 一、专业团队&#xff0c;服务…

反沙箱思路总结

文章目录 反调试反沙箱时间对抗环境检测 反虚拟机黑DLL父进程检测傀儡进程后记 反调试 IsDebuggerPresent #include<windows.h> #include<stdio.h> BOOL check() {return IsDebuggerPresent(); } BOOL isPrime(long long number){if (number < 1)return FALSE…

制作一个RISC-V的操作系统七-UART初始化(UART NS16550A 规定 目标 发送数据 代码 extern)

文章目录 UARTNS16550A规定目标发送数据代码extern UART 对应到嵌入式开发中&#xff0c;qemu模拟的就是那块开发板&#xff08;硬件&#xff09; 电脑使用qemu时可以理解为qemu模拟了那块板子&#xff0c;同时那块板子与已经与你的电脑相连接了&#xff08;我们对应的指定的内…

面向大模型的低秩分解与模型压缩技术研究

1. 背景介绍 随着深度学习技术的快速发展&#xff0c;大规模神经网络模型在图像识别、语音识别、自然语言处理等领域取得了显著的成果。然而&#xff0c;这些模型通常具有极高的计算复杂度和存储需求&#xff0c;这给实际应用带来了巨大的挑战。为了克服这些限制&#xff0c;研…

【Linux】命令拾遗

Note: 记录在学习过程容易遗忘、混淆的Linux命令 1. 重定向 >和>>都是输出重定向&#xff0c;区别是>会覆盖而>>是追加。 <是输入重定向&#xff0c;例如&#xff1a;command < file&#xff0c;会将 file 中的内容作为 command 命令参数。 1>正…