《MATLAB 批量把振動 CSV(含中文“序號/采樣頻率”)穩健轉成 .mat:自動解析+統一換算+按 H/I/O/F-rpm-fs-load 命名》

一文搞定:批量把中文頭信息的 CSV(含“序號/采樣頻率”等)穩健轉成 .mat,并按規則重命名(H/I/O/F-rpm-fs-load)


1. 項目背景

在振動/故障診斷采集里,我們經常得到一批 CSV 文件,文件名形如:

jiankang-100rpm-2kHz-0%Load_all.csv
neiquan-1300rpm-2kHz-0%Load_all.csv
waiquan-500rpm-8kHz-10%Load_all.csv

每個文件前面是若干中文元信息(比如“采樣頻率,2.000kHz”),接著是表頭行(通常包含**“序號”),再往下是多列數據**。但是這些 CSV 在編碼、分隔符、列類型上并不統一(GBK/UTF-8、英文/中文逗號、文本列混入等),直接 readtable 往往會報錯或讀亂。

本文給出一套魯棒的 MATLAB 腳本,把這類 CSV 批量轉換為 .mat,并把關鍵信息(采樣頻率、轉速、負載、列名、時間軸等)保存到結構體里,最后按規則重命名輸出文件。


2. 明確需求(已全部實現)

  1. 批量讀取目錄下的 CSV/XLSX(含中文頭信息、表頭“序號”、多列數據)。
  2. 采樣頻率以文件內部為準(優先讀取“采樣頻率,2.000kHz”),找不到再回退文件名中的 2kHz/8kHz。
  3. 僅保留數值數據列;遇到文本列自動嘗試轉數字,全 NaN 的列丟棄;若存在“序號”列,從數據中自動剔除。
  4. 按固定換算對每列做統一變換:/1000 *100 *60 /4(即 ×0.15)。
  5. 輸出 .mat 頂層變量名為 data(結構體),字段:
    • signal (N×C) 換算后的信號矩陣
    • varNames (C×1 string) 列名
    • N,C 樣本數/通道數
    • fs 采樣頻率(Hz)
    • rpm 轉速(r/min)
    • load_pct 負載(%)(若只有 HP 也會嘗試轉讀;缺失時置 0)
    • t 時間軸(秒),按 fs 自動生成
  6. 重命名規則(來自實際需求):
    • 條件碼(來自文件名中第一段):
      • jiankang/健康H
      • guzhang/故障F
      • neiqian/neiquan/內圈/內環I
      • waiquan/外圈/外環O
      • 未識別 → X
    • 文件名格式:<條件碼>-<rpm>-<fs_kHz>-<load>.mat
      • 例如:jiankang-100rpm-2kHz-0%LoadH-100-2-0.mat
  7. 強魯棒性:自動嘗試編碼(UTF-8/GB18030/ISO-8859-1)、自動識別分隔符(英文/中文逗號、分號、Tab)、保留原始列名(消除“列名被修改”警告)、兼容舊版 WhitespaceRule 選項。

3. 解析思路

  • 定位數據起始:優先尋找包含“序號”的表頭行;若找不到,按“第一行像數據(數字+分隔符+數字)”來定位,上一行視為表頭。
  • 讀表策略detectImportOptions + readtable,強制 VariableNamingRule='preserve',保留中文列名;遇到老版本不支持的選項自動跳過。
  • 列類型清洗:對每列做統一轉換:數字列直取,文本/元胞/類別列轉字符串后 str2double全 NaN 的列剔除
  • 剔除“序號”列:只把它用作定位,不進入最終 signal
  • 元信息解析:把表頭之前的“Key,Value”行轉成 KV 表;優先從中解析“采樣頻率”(kHz/Hz 均兼容)。
  • 文件名解析:提取條件/轉速/采樣率/負載(HP 或 %Load)。
  • 統一換算signal = data * 0.15
  • 時間軸:若 fs 有效,t = (0:N-1)/fs

4. 完整代碼(保存為 batch_csv2mat.m

直接把下面整段保存為 batch_csv2mat.m。MATLAB 路徑切到該文件所在目錄后調用即可。

function batch_csv2mat(inDir, outDir)
% 批量把類似
%   jiankang-100rpm-2kHz-0%Load_all.csv
%   neiquan-1300rpm-2kHz-0%Load_all.csv
%   jiankang-variable-speed-2kHz-0%Load_all.csv
%   waiquan-variable-speed-2kHz-0%Load_all-1.csv   <-- 重復測試1
% 轉為 .mat
%
% 命名:
%   定速: <code>-<rpm>-<fs_kHz>-<load>[_RPT_<n>].mat
%   變速: <code>-VS-<fs_kHz>-<load>[_RPT_<n>].mat
%   例: H-100-2-0.mat, H-VS-2-0_RPT_1.mat
%
% 頂層變量名:data(struct),僅包含:
%   data.signal   [N x C]  (已做統一換算 ×0.15)
%   data.varNames [C x 1]  列名(保留中文)
%   data.N, data.C
%   data.fs  (Hz), data.rpm (r/min), data.load_pct (%)
%   data.t   [N x 1] 時間(秒;fs 有效時生成)if nargin < 2 || isempty(outDir), outDir = fullfile(inDir,'mat'); endif ~exist(inDir,'dir'), error('輸入目錄不存在:%s', inDir); endif ~exist(outDir,'dir'), mkdir(outDir); endfiles = [dir(fullfile(inDir,'*.csv'));  dir(fullfile(inDir,'*.CSV')); ...dir(fullfile(inDir,'*.txt'));  dir(fullfile(inDir,'*.TXT')); ...dir(fullfile(inDir,'*.xlsx')); dir(fullfile(inDir,'*.XLSX'))];if isempty(files)warning('目錄中未發現 CSV/TXT/XLSX:%s', inDir);return;endwarning('off','MATLAB:table:ModifiedVarnames');warning('off','MATLAB:table:ModifiedAndSavedVarnames');for k = 1:numel(files)fpath = fullfile(files(k).folder, files(k).name);tryrecFull = parse_one_file(fpath);                 % 解析(含 is_vs / rpt_idx)outname = make_outname(recFull, files(k).name);  % 生成目標 .mat 名data    = prune_and_convert(recFull);            % 僅保留 + 換算 + 生成 tsave(fullfile(outDir,outname), 'data', '-v7.3'); % 頂層變量名為 datafprintf('OK  -> %s\n', outname);catch MEfprintf(2,'FAIL -> %s\n  %s\n', files(k).name, ME.message);endend
end%% =================== 僅保留字段并做換算(并生成 t) ===================
function data = prune_and_convert(R)scale  = (10*60)/(4*1000);       % /1000 * 10 * 60 / 4 = 0.15signal = R.data * scale;data = struct();data.signal    = signal;         % [N x C]data.varNames  = R.varNames;     % 列名data.N         = size(signal,1);data.C         = size(signal,2);data.fs        = R.fs;data.rpm       = R.rpm;data.load_pct  = R.load_pct;if ~isnan(R.fs) && R.fs > 0data.t = (0:data.N-1).' / R.fs;elsedata.t = [];end
end%% =================== 單文件解析(魯棒:支持 VS / RPT,僅提數值列) ===================
function rec = parse_one_file(fpath)[~, base, ext] = fileparts(fpath);isCSV = ismember(lower(ext), {'.csv','.txt'});% ---------- 0) 提取重復測試編號,并得到用于解析的 baseCore ----------% 支持:xxx_all-1, xxx-1(結尾為 -數字)rpt_idx = NaN;tok = regexp(base, '(?:_all)?-(\d+)$', 'tokens', 'once');if ~isempty(tok), rpt_idx = str2double(tok{1}); endbaseCore = regexprep(base, '(?:_all)?-(\d+)$', '');   % 去掉尾部編號% ---------- 1) 多編碼讀取并清洗(僅 CSV/TXT) ----------lines = strings(0,1); encList = {'UTF-8','GB18030','ISO-8859-1'};if isCSVfor e = 1:numel(encList)trylines = readlines(fpath, "Encoding", encList{e});if ~isempty(lines); break; endcatch, endendif isempty(lines), error('無法按常見編碼讀取此文件'); endlines = normalize_lines(lines);end% ---------- 2) 表頭行定位 ----------headerLineIdx = [];if isCSVheaderLineIdx = find(contains(lines, "序號"), 1, 'first');if isempty(headerLineIdx)pat = "^\s*\d+\s*[,;\t]\s*[-\d\.]+";isData = ~cellfun('isempty', regexp(cellstr(lines), pat, 'once'));dataStart = find(isData, 1, 'first');if ~isempty(dataStart) && dataStart > 1headerLineIdx = dataStart - 1;elseerror('未找到“序號”表頭且無法定位數據起始行。');endendend% ---------- 3) detectImportOptions + readtable ----------if isCSVopts = detectImportOptions(fpath, 'NumHeaderLines', headerLineIdx-1);if isempty(opts.Delimiter) || isequal(opts.Delimiter,' ')opts.Delimiter = {',',';','\t',','};endtry, opts.VariableNamingRule = 'preserve'; catch, endtry, opts.PreserveVariableNames = true;  catch, endtrytxtVars = opts.VariableNames( ismember(opts.VariableTypes, {'char','string','categorical'}) );if ~isempty(txtVars)try, opts = setvaropts(opts, txtVars, 'WhitespaceRule','preserve'); catch, endtry, opts = setvaropts(opts, txtVars, 'EmptyFieldRule','auto');      catch, endendcatch, endtryT = readtable(fpath, opts);catchtry, T = readtable(fpath, 'VariableNamingRule','preserve'); catchT = readtable(fpath, 'PreserveVariableNames', true);endendelsetry, T = readtable(fpath, 'VariableNamingRule','preserve'); catchT = readtable(fpath, 'PreserveVariableNames', true);endendif isempty(T), error('表格為空:%s', fpath); end% ---------- 4) 僅提取數值列(自動數值化,剔除全 NaN / 不齊列) ----------[A, vnames] = table_to_numeric(T);if isempty(A) || size(A,2) == 0error('未能從表格中提取到任何數值列:%s', fpath);end% 若存在“序號”,從數據中移除idxCol = find(contains(vnames, "序號"), 1, 'first');if ~isempty(idxCol)data = A(:, setdiff(1:size(A,2), idxCol));varNames = vnames(setdiff(1:numel(vnames), idxCol));elsedata = A;varNames = vnames;end% ---------- 5) 元信息 & 采樣頻率(內部優先) ----------meta = struct(); meta.raw = strings(0,1);if isCSV && headerLineIdx>1, meta.raw = lines(1:headerLineIdx-1); endmeta.kv = table(string.empty, string.empty,'VariableNames',{'Key','Value'});if ~isempty(meta.raw)K = strings(0,1); V = strings(0,1);for i = 1:numel(meta.raw)s = char(meta.raw(i)); if isempty(s), continue; ends = strrep(s,',',','); s = strrep(s,';',';');parts = split(string(s), ",");if numel(parts)>=2K(end+1,1) = strtrim(parts(1));V(end+1,1) = strtrim(strjoin(parts(2:end), ",")); %#ok<AGROW>endendmeta.kv = table(K, V, 'VariableNames', {'Key','Value'});endfs = NaN;if ~isempty(meta.kv.Key)hit = contains(meta.kv.Key, "采樣頻率");if any(hit)val = meta.kv.Value(find(hit,1,'first'));tok = regexp(val, '([\d\.]+)\s*([kK]?[Hh]z)?', 'tokens', 'once');if ~isempty(tok)v = str2double(tok{1}); unit = lower(strtrim(tok{2}));if isempty(unit)||strcmp(unit,'hz'), fs=v;elseif strcmp(unit,'khz'), fs=v*1000;else, fs=v;endendendend% ---------- 6) 文件名解析:定速 or 變速 VS ----------cond=""; rpm=NaN; fs_name=NaN; load_pct=NaN; load_hp=NaN; is_vs=false;% 定速:xxx-1000rpm-2kHz-0%Load / xxx-1000rpm-2kHz-10HPm1 = regexp(baseCore,'^(?<cond>[^-]+)-(?<rpm>\d+)rpm-(?<fs>[\d\.]+)[kK]Hz-(?<hp>\d+)HP','names');m2 = regexp(baseCore,'^(?<cond>[^-]+)-(?<rpm>\d+)rpm-(?<fs>[\d\.]+)[kK]Hz-(?<pct>\d+)\%Load','names');% 變速:xxx-variable-speed-2kHz-0%Load / xxx-vs-2kHz-...vsToken = '(?:variable[-_ ]?speed|variablespeed|vs|bianzhuansu|bian_su|bian_zs|變轉速|變速|變轉)';mVS1 = regexp(baseCore, ['^(?<cond>[^-]+)-' vsToken '-(?<fs>[\d\.]+)[kK]Hz-(?<hp>\d+)HP'], 'names');mVS2 = regexp(baseCore, ['^(?<cond>[^-]+)-' vsToken '-(?<fs>[\d\.]+)[kK]Hz-(?<pct>\d+)\%Load'], 'names');if ~isempty(m1)cond=string(m1.cond); rpm=str2double(m1.rpm);fs_name=str2double(m1.fs)*1000; load_hp=str2double(m1.hp);elseif ~isempty(m2)cond=string(m2.cond); rpm=str2double(m2.rpm);fs_name=str2double(m2.fs)*1000; load_pct=str2double(m2.pct);elseif ~isempty(mVS1)cond=string(mVS1.cond); is_vs=true;fs_name=str2double(mVS1.fs)*1000; load_hp=str2double(mVS1.hp);elseif ~isempty(mVS2)cond=string(mVS2.cond); is_vs=true;fs_name=str2double(mVS2.fs)*1000; load_pct=str2double(mVS2.pct);endif isnan(fs), fs = fs_name; end% ---------- 7) 輸出(供命名與裁剪使用) ----------rec = struct();rec.data      = data;rec.varNames  = varNames;rec.fs        = fs;rec.rpm       = rpm;rec.load_pct  = load_pct;rec.load_hp   = load_hp;rec.condition = cond;rec.is_vs     = is_vs;    % 是否變速rec.rpt_idx   = rpt_idx;  % 重復測試編號(NaN 表示無編號)
end%% =================== 把 table 列轉成純數值 ===================
function [A, vnames] = table_to_numeric(T)V = T.Properties.VariableNames;n = height(T);cols = []; vnames = strings(0,1);for i = 1:numel(V)x = T.(V{i});if isrow(x), x = x.'; endif isnumeric(x)num = double(x);elseif islogical(x)num = double(x);elseif iscell(x) || isstring(x) || ischar(x) || iscategorical(x)if iscategorical(x), x = cellstr(x); endif iscell(x)trys = string(x);catchs = string(cellfun(@(z)string(z), x, 'UniformOutput', false));endelses = string(x);ends = strrep(s, " ", "");s = strrep(s, ",", "");    % 千分位逗號num = str2double(s);elsecontinue;  % 其它類型不處理endif ~isnumeric(num) || all(isnan(num)) || numel(num)~=ncontinue;  % 丟掉全 NaN 或長度不匹配的列endcols = [cols, num];                 %#ok<AGROW>vnames(end+1,1) = string(V{i});     %#ok<AGROW>endA = cols;
end%% =================== 命名:定速/變速 + 重復測試后綴 ===================
function outname = make_outname(rec, origName)% 條件碼映射:H(健康) F(故障) I(內圈) O(外圈)condMap = containers.Map( ...{ 'jiankang','healthy','health','jk','normal','健康', ...'guzhang','fault','gz','faulty','故障', ...'neiqian','neiquan','inner','nei','內圈','內環','內', ...'waiquan','outer','wai','外圈','外環','外' }, ...{ 'H','H','H','H','H','H', ...'F','F','F','F','F', ...'I','I','I','I','I','I','I', ...'O','O','O','O','O','O' } );key = lower(string(rec.condition));if condMap.isKey(key)code = condMap(key);elseif strlength(key)>0code = upper(extractBefore(key + " ", 2));elsecode = "X";endfs_khz = rec.fs/1000; if isnan(fs_khz), fs_khz = 0; endfs_khz = round(fs_khz);if ~isnan(rec.load_hp)loadVal = rec.load_hp;elseif ~isnan(rec.load_pct)loadVal = rec.load_pct;elseloadVal = 0;endloadVal = round(loadVal);if isfield(rec,'is_vs') && rec.is_vsbaseName = sprintf('%s-VS-%d-%d', code, fs_khz, loadVal);elserpm = rec.rpm; if isnan(rpm), rpm = 0; endbaseName = sprintf('%s-%d-%d-%d', code, round(rpm), fs_khz, loadVal);end% 重復測試編號后綴if isfield(rec,'rpt_idx') && ~isnan(rec.rpt_idx)baseName = sprintf('%s_RPT_%d', baseName, rec.rpt_idx);endoutname = [baseName '.mat'];if code=="X"warning('無法從條件解析出代碼:%s -> 用 X 代替(文件:%s)', string(rec.condition), origName);end
end%% =================== 工具:規范行文本 ===================
function lines = normalize_lines(lines)lines = replace(lines, char(65279), "");   % BOMlines = replace(lines, ",", ",");lines = replace(lines, ";", ";");
end

5. 使用方法

% 1) 放置
% 將 batch_csv2mat.m 放到 MATLAB 當前工作目錄% 2) 執行(輸出目錄可省略,默認在輸入目錄下新建 mat/)
batch_csv2mat('F:\input', ...'F:\mat_out');% 3) 查看一個轉換結果
S = load('F:\2025.9.6-歐瑞-6305-軸承\mat_out\H-100-2-0.mat');  % 舉例
data = S.data;
plot(data.t, data.signal(:,1)); grid on
xlabel('Time (s)'); ylabel(data.varNames(1));
title('Channel 1');

6. 輸出內容說明

  • MAT 文件名H/I/O/F-<rpm>-<fs_kHz>-<load>.mat
  • MAT 內部變量:頂層變量 data(struct)
    • signalN×C,已統一換算(×0.15)
    • tN×1
    • fs/rpm/load_pct:數值信息
    • varNames:列名(中文保留)
    • N/C:樣本數/通道數

7. 常見問題與已處理

  • “變量名被修改”警告 → 已強制保留原始列名(VariableNamingRule='preserve'),并靜默相關警告。
  • WhitespaceRule 未知 → 僅在文本列存在且當前版本支持時才設置,不支持自動跳過。
  • “無法串聯 double 和 cell” → 讀取后對每列做數值化,全 NaN 列剔除,徹底避免此類報錯。
  • 找不到“序號”表頭 → 啟用“數據模式”兜底:定位第一行“像數據”的行,自動確定表頭。
  • 編碼/分隔符混亂 → 自動嘗試 UTF-8/GB18030/ISO-8859-1,分隔符支持英文/中文逗號、分號、Tab。

8. 一致性校驗(可選)

想確認換算與數據無丟失,可做如下對比(把 CSV 原始數值×0.15 后與 .mat 比較):

csvf = '...原CSV路徑...';
S = load('...對應的.mat');
data = S.data;T = readtable(csvf,'VariableNamingRule','preserve');
A = table2array(T);             % [序號, 數據...]
X = A(:,2:end) * 0.15;          % 同步換算fprintf('max abs diff = %.3g\n', max(abs(X(:)-data.signal(:))));

max abs diff 應該接近 0(浮點微小誤差內)。


9. 可擴展方向

  • 并行加速:外層 for 可改 parfor(需要 Parallel Toolbox)。
  • 統一合并:把所有 MAT 聚合成一個大矩陣 + 索引表(condition/rpm/fs/load)。
  • 自定義換算:把 scale = 0.15 改成配置項,或為不同列設置不同系數。
  • 更豐富的命名映射:在 condMap 內繼續擴展你的條件類別。

10. 結語

這套腳本針對“中文頭信息 + 序號表頭 + 多源編碼/分隔符 + 列類型不一致”的工業 CSV 做了較強的兼容性處理,并把研究中常用的關鍵信息全部沉淀進 .mat(變量名、采樣率、時間軸等),開箱即用。歡迎在此基礎上繼續定制:比如統一單位、自動頻譜、批量可視化、或者和后續深度學習數據管線打通等。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921523.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity與硬件交互終極指南:從Arduino到自定義USB設備

這篇教程將遵循“是什么-為什么-怎么做”的結構,從宏觀思路講起,再深入到具體的技術實現,并附上可以直接使用的詳細代碼和注釋,確保不同水平的讀者都能從中受益。 前言:當虛擬照進現實 在游戲開發和交互設計的世界里,我們常常滿足于鍵盤、鼠標和手柄。但當你想要創造真正…

Tomcat 日志文件名的命名規范

1. 核心日志類型及命名規范 (1) Catalina 日志&#xff08;引擎級日志&#xff09; 文件名&#xff1a;catalina.<yyyy-MM-dd>.log說明&#xff1a;記錄 Tomcat 啟動、關閉、嚴重錯誤等全局事件。示例&#xff1a;catalina.2025-09-07.log (2) Access 日志&#xff08;訪…

.vsdx文件轉pdf、word、ppt等文件在線分享(免費版)

網址如下&#xff1a; https://www.easeconvert.com/visio-to-pdf/ 只需要把.vsdx文件放到網址中即可

如何在Docker容器之間進行通信?

目錄 1. 使用 Docker 網絡(推薦) 步驟: 特點: 2. 端口映射(主機中轉) 步驟: 特點: 3. 使用 link(不推薦,已過時) 4. 跨主機容器通信 總結 在 Docker 中,容器之間的通信可以通過多種方式實現,選擇哪種方式取決于你的具體需求(如網絡隔離性、跨主機通信等…

從 “Hello AI” 到企業級應用:Spring AI 如何重塑 Java 生態的 AI 開發

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

震驚!僅用10張照片就能隨意編輯3D人臉?韓國KAIST最新黑科技FFaceNeRF解析!

FFaceNeRF模塊 論文《FFaceNeRF: Few-shot Face Editing in Neural Radiance Fields》 深度交流Q裙&#xff1a;1051849847 全網同名 【大嘴帶你水論文】 B站定時發布詳細講解視頻 視頻地址&#xff0c;點擊查看論文詳細講解&#xff0c;每日更新&#xff1a; https://b23.t…

spring-ai-alibaba-deepresearch 學習(十四)——CoderNode

本篇為spring-ai-alibaba學習系列第四十篇前面介紹 ParalellExecutorNode 會為后續的 m 個 CoderNode 分配任務現在來看一下處理型任務的處理節點 coder_{i}該類節點主要負責執行一些操作&#xff0c;例如執行python代碼、調用mcp等提示詞以下是該文檔的中文翻譯&#xff1a;--…

基于STM32設計的激光充電控制系統(華為云IOT)_277

文章目錄 一、前言 1.1 項目介紹 【1】項目開發背景 【2】設計實現的功能 【3】項目硬件模塊組成 【4】設計意義 【5】國內外研究現狀 【6】摘要 1.2 設計思路 1.3 系統功能總結 1.4 開發工具的選擇 【1】設備端開發 【2】上位機開發 1.5 參考文獻 1.6 系統框架圖 1.7 系統原理…

【牛客拼數最大對比從左至右每位break與continue】2022-11-5

緣由牛客拼數最大問題&#xff0c;不從結果出發那種做法-編程語言-CSDN問答 思路倒序數后從右逐位比較大小 int 反序數(int n) {int nn 0;while (n)nn nn * 10 n % 10, n / 10;return nn; } void 牛客拼數位最大對比() {//4 7 13 4 246;3 13 312 343;3 1 2 3int a[20]{}, x…

【考研C語言編程題】數組元素批量插入實現(含圖示+三部曲拆解)

【考研C語言編程題】數組元素批量插入實現&#xff08;含圖示三部曲拆解&#xff09; 一、題目要求 編寫C語言程序&#xff0c;實現將數組b的所有元素批量插入到數組a的指定位置&#xff08;位置從0開始計數&#xff09;。要求嚴格遵循“騰出空間→插入元素→更新長度”的操作三…

監控系統 | 腳本案例

1、監控系統中的cpu、內存、硬盤、、使用率超過80%進行郵件告警&#xff08;可使用郵箱QQ&#xff09;詳細步驟說明&#xff1a;1. 腳本初始化#!/bin/bash&#xff1a;指定使用bash shell執行dateMax80&#xff1a;設置資源使用率閾值&#xff08;80%&#xff09;2. 資源監控CP…

Vulkan 學習(20)---- UniformBuffer 的使用

目錄UniformBufferDescriptorSetLayout 和 VkBuffer頂點著色器定義描述符布局(DescriptorSetLayout)創建 UniformBuffer描述符池(DescriptorSet Pool)描述符集(DescriptorSet)更新描述符集使用描述符集使用多個 DescriptorUniformBuffer 本篇文檔是通過 Uniform Buffer 的使用…

[光學原理與應用-461]:波動光學 - 波片實現偏振態的轉換或調整

波片&#xff08;Wave Plate&#xff09;是一種基于雙折射效應的光學元件&#xff0c;其核心功能是通過控制光波中尋常光&#xff08;o光&#xff09;和非尋常光&#xff08;e光&#xff09;的相位差&#xff0c;實現偏振態的轉換或調整。以下是波片的主要功能及其原理的詳細說…

Flutter之riverpod狀態管理詳解

一、riverpod狀態管理中所涉及到的provider對比分析Provider 類型核心用途最佳適用場景優勢劣勢/注意事項Provider(v1)暴露一個恒定不變的&#xff08;或不需要Riverpod管理的&#xff09;對象或值。依賴注入&#xff08;如&#xff1a;Repository, Logger, ApiClient&#xff…

昇騰310i Pro固件說明

目錄 驅動和固件 驅動固件文件 firware固件 24.2版本對應的固件 驅動和固件共同文件 燒結到flash中的固件 總結 啟動流程 固件關系猜測 啟動關鍵信息 efuse atu大小 GPU的bar 總結 驅動和固件 以最新的25.2 對應的驅動和固件為例說明&#xff1a; 驅動固件文件…

【LeetCode熱題100道筆記】二叉樹的右視圖

題目描述 給定一個二叉樹的 根節點 root&#xff0c;想象自己站在它的右側&#xff0c;按照從頂部到底部的順序&#xff0c;返回從右側所能看到的節點值。 示例 1&#xff1a; 輸入&#xff1a;root [1,2,3,null,5,null,4] 輸出&#xff1a;[1,3,4] 解釋&#xff1a;示例 2&am…

Redis《RedisSerializer》

文章目錄RedisSerializer為什么要使用如何使用RedisSerializer總結RedisSerializer 為什么要使用 RedisTemplate 有默認的序列化器&#xff0c;但默認使用的 JdkSerializationRedisSerializer 存在一些問題&#xff1a; 序列化后的數據包含類信息等額外內容&#xff0c;導致…

基于開源AI大模型AI智能名片S2B2C商城小程序的文案引流與社交傳播運營策略研究

摘要&#xff1a;本文聚焦開源AI大模型AI智能名片S2B2C商城小程序&#xff0c;探討其文案引流與社交傳播運營策略。闡述文案在引流中的重要性&#xff0c;分析開源AI大模型AI智能名片S2B2C商城小程序的特性&#xff0c;研究文案設計策略、社交傳播機制及運營策略實施與效果評估…

NGINX vs HAProxy vs LVS:優勢與選型分析

目錄 1. 負載均衡的江湖:三巨頭初探 2. NGINX:全能選手的多面魅力 NGINX 核心優勢 NGINX 的短板 NGINX 實戰案例 3. HAProxy:調度大師的精細之道 HAProxy 核心優勢 HAProxy 的短板 HAProxy 實戰案例 4. LVS:內核猛獸的極致性能 LVS 核心優勢 LVS 的短板 LVS 實…

AI+ 行動意見解讀:音視頻直播SDK如何加速行業智能化

引言&#xff1a;國家戰略、技術基座與行業落地 8 月底&#xff0c;國務院發布了《“人工智能”行動意見》&#xff0c;明確將人工智能提升為繼“互聯網”之后的新一輪國家級戰略抓手。這份文件的關鍵詞已經不再是“連接”與“優化”&#xff0c;而是“重塑”與“躍遷”&#…