ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MATLAB字符串处理实战:从基础操作到正则表达式与文件路径处理

MATLAB字符串处理实战:从基础操作到正则表达式与文件路径处理 1. 项目概述为什么字符串处理是MATLAB工程师的必修课提起MATLAB很多人的第一反应是矩阵运算、信号处理或者控制系统仿真。没错这些是它的看家本领。但在实际项目中无论是处理实验数据文件、解析传感器日志、生成自动化报告还是构建带参数的用户界面字符串处理都像空气一样无处不在却又常常被新手忽略。我见过不少工程师矩阵算得飞起一到要批量重命名文件、从一长串混合数据中提取特定信息或者动态生成图表标题时就开始写一堆笨拙的循环和硬编码效率低下还容易出错。“MATLAB字符串处理”这个主题远不止是几个函数那么简单。它关乎数据I/O输入/输出的流畅性、代码的健壮性以及自动化流程的优雅程度。一个文本格式的CSV数据文件你需要读取它一组以特定规则命名的图片你需要按顺序加载它们仿真完成后你需要生成一份包含关键参数和结果的总结文档。这些场景的核心都是字符串操作。掌握它意味着你能让MATLAB不仅会“计算”更会“沟通”和“理解”杂乱的真实世界数据。本文将从最基础的字符数组与现代字符串类型的区别讲起拆解拼接、查找、替换、分割、匹配等核心操作并深入到正则表达式这个“大杀器”最后分享文件路径操作、文本数据清洗等实战场景。无论你是刚接触MATLAB的学生还是需要处理大量文本数据的科研人员或工程师这些内容都能让你的工具箱立刻丰富起来。2. 字符串基础从字符数组到字符串数组的演进在深入各种操作之前我们必须理清MATLAB中两种核心的文本数据类型字符数组char和字符串数组string。这是很多混淆的源头理解它们的差异是写出高效、现代代码的第一步。2.1 传统字符数组以矩阵思维处理文本在R2016b版本之前MATLAB中处理文本的唯一方式是字符数组。你可以把它想象成一个二维的字符矩阵每一行是一个文本行每一列是一个字符位置。% 创建一个字符数组 charArray Hello, World; whos charArray % 输出Name Size Bytes Class Attributes % charArray 1x12 24 char这里的关键是1x12表示这是一个1行12列的矩阵。每个字符包括空格和标点都占据一个“元素”位置。当你需要存储多行文本时必须保证每一行的字符数列数完全一致否则会报错。通常会用char函数或手动填充空格来实现。% 创建多行字符数组 - 必须等长 multiChar char(MATLAB, Python, C); disp(multiChar) % 输出 % MATLAB % Python % C % 注意‘Python’后面自动补了空格C后面补了三个空格以对齐到最长行‘MATLAB’的6列。字符数组的操作非常“矩阵化”。例如你可以通过索引访问单个字符charArray(1)返回H也可以进行矩阵拼接[str1, str2]。这种设计的优势是直观且在某些底层操作中高效但缺点也很明显处理不等长文本麻烦且大多数函数如strfind对多行文本的支持不够友好常常需要配合循环。2.2 现代字符串数组为文本而生的容器从R2016b开始MATLAB引入了string数据类型。这是一个革命性的变化。字符串数组的每个元素都是一个独立的、自包含的文本片段长度可以各不相同。它更像其他现代编程语言如Python、C#中的字符串。% 创建一个字符串标量单个字符串 strScalar Hello, World; whos strScalar % 输出Name Size Bytes Class Attributes % strScalar 1x1 174 string % 创建一个字符串数组 strArray [MATLAB, Python, C]; disp(strArray) % 输出 % MATLAB Python C % 注意双引号是字符串的标识。每个元素长度不同但存储在一个1x3的数组里。字符串数组用双引号()定义而字符数组用单引号()。whos命令显示strScalar是1x1的string类型占用174字节包含了一些元数据开销而不再是按字符数计算。对于strArray它是一个1行3列的数组但每个“格子”里装的是一整段文本而不是一个字符。注意在代码中混合使用单引号和双引号是常见的错误来源。记住一个简单的规则想要一个可以包含任意长度文本的、功能更强大的“字符串对象”用双引号当你需要精确控制字符矩阵或者调用一些遗留函数时才用单引号。在新项目中我强烈建议优先使用string类型。2.3 类型转换与选择策略两种类型之间可以相互转换这是兼容旧代码和灵活操作的关键。字符数组转字符串数组使用string函数。它会将输入的字符数组的每一行转换为字符串数组的一个独立元素。charMatrix [ABC; DEF]; % 2x3 char strFromChar string(charMatrix); % 2x1 string array: [ABC; DEF]字符串数组转字符数组使用char函数。注意如果字符串数组元素长度不一转换成的字符矩阵会以空格填充至最长元素的长度。strArray [Short, A longer text]; charFromStr char(strArray); % 2x14 char第二行‘Short’后面补了9个空格。如何选择我的经验法则是默认使用string几乎所有新的文本处理任务都应使用string类型。它的函数更丰富如strlength,split,replace等成员函数形式支持向量化操作代码更简洁。需要兼容旧代码时使用char当你调用的某个工具箱函数或自己写的旧函数明确要求字符数组输入时。进行底层字符操作时使用char例如你需要精确地按位置修改文本中的某个特定字符时字符数组的矩阵索引可能更直接。3. 核心操作一字符串的构建、拼接与格式化处理字符串第一关就是如何把它们组合起来。无论是生成文件名、创建消息还是组装SQL查询语句拼接都必不可少。3.1 拼接操作,strcat,append与joinMATLAB提供了多种拼接方式各有适用场景。运算符 (仅适用于字符串数组)这是最直观的拼接方式类似于数字加法。firstName John; lastName Doe; fullName firstName lastName; % 结果为 John Doe它只能用于string类型对char数组使用会尝试算术加法通常会导致错误。strcat函数 (兼容 char 和 string)这是一个历史悠久的函数可以接受字符数组或字符串数组输入并沿指定维度拼接。它会自动忽略输入尾部的空格/空字符这一点需要特别注意。str1 Hello ; % 注意末尾有空格 str2 World; result strcat(str1, str2); % 结果为 HelloWorld末尾空格被忽略了对于字符串数组strcat会按元素对应位置进行拼接。A [A, B]; B [1, 2]; C strcat(A, -, B); % 结果为 [A-1, B-2]append函数 (推荐用于字符串数组)这是string类型的成员函数行为更符合直觉。它不会忽略尾部空格并且语法清晰。str1 Hello ; str2 World; result append(str1, str2); % 结果为 Hello World空格保留 % 等价于 str1 str2join函数 (连接数组元素)当你有一个字符串数组想用特定的分隔符把它们连成一个单独的字符串时join就派上用场了。words [MATLAB, is, powerful]; sentence join(words); % 默认用空格连接结果为 MATLAB is powerful sentenceWithDash join(words, -); % 用‘-’连接结果为 MATLAB-is-powerful实操心得在日常工作中我几乎只用用于字符串和join。操作符写起来最快意图最明确。join在将路径片段组合join([folder, subfolder, filename], filesep)或者处理由split得到的单词列表时极其方便。strcat由于会自动去除尾部空格在需要精确控制格式如生成固定宽度的文本行时容易引入难以察觉的bug所以我通常会避免使用除非在处理必须兼容char的旧代码时。3.2 格式化输出sprintf与compose的强大之处简单的拼接够用了但当你需要将数字、日期等变量以特定格式如固定小数位数、科学计数法、前导零嵌入到文本中时就需要格式化函数。sprintf(格式化并返回字符串)这是从C语言继承来的经典函数功能极其强大。它使用格式说明符如%f表示浮点数%d表示整数%s表示字符串来控制输出。name Alice; score 95.5; output sprintf(%s scored %.2f out of 100., name, score); % 输出 Alice scored 95.50 out of 100.%.2f表示浮点数保留两位小数。sprintf对于生成报告、日志信息、自定义文件名如data_20231027_001.csv至关重要。compose函数 (向量化格式化)sprintf一次只能处理一组输入。如果你有一个数值数组想为每个元素生成格式化的字符串用循环会很慢。compose提供了向量化操作。values [100, 95.5, 87.3]; formattedStrings compose(Score: %05.1f, values); % %05.1f: 总宽5位含1位小数不足补零 % 输出 1×3 string 数组 % [Score: 100.0, Score: 095.5, Score: 087.3]这在批量生成图表标签、数据条目描述时效率极高。注意事项sprintf的格式字符串非常灵活但也容易出错。常见的坑是格式说明符的数量和类型必须与后面输入变量的数量和类型严格匹配否则会报错或输出乱码。在编写复杂的格式字符串时建议先在命令行用小数据测试一下。4. 核心操作二字符串的查找、提取与替换从一大段文本中找到你需要的信息或者修改其中的部分内容是文本处理中最常见的任务。4.1 查找子串contains,startsWith,endsWith,strfind根据你的查找目的选择最合适的函数。contains(检查是否包含)返回逻辑数组指示每个字符串元素是否包含指定的子串。这是最常用、最高效的查找函数。files [data_001.mat, notes.txt, image_001.png, config.yaml]; isDataFile contains(files, data); % 返回 [true, false, false, false] isImageFile contains(files, [.png, .jpg]); % 可以查找多个模式返回 [false, false, true, false]startsWith/endsWith(检查开头/结尾)专门用于检查前缀和后缀在筛选特定类型文件时比contains更精确。isTxtFile endsWith(files, .txt); % 返回 [false, true, false, false]strfind(查找子串位置)返回子串在字符串中起始位置的索引。如果没找到返回空数组[]。它适用于需要知道子串具体在哪里的场景。str The quick brown fox jumps over the lazy dog; idx strfind(str, fox); % 返回 17因为‘f’在第17个字符位置 idx strfind(str, cat); % 返回 []未找到对于字符串数组strfind返回一个细胞数组cell array每个细胞元素对应一个查找结果的位置索引。这比contains的结果更“重”所以如果只需要知道“是否存在”优先用contains。4.2 提取子串extractBefore,extractAfter,extractBetween一旦知道了位置或者基于特定的分隔符我们就需要把子串提取出来。MATLAB提供了一组非常直观的提取函数。基于位置或子串的提取str 2023-10-27_log.csv; % 提取‘-’之前的部分 year extractBefore(str, -); % 返回 2023 % 提取第一个‘-’之后的部分 rest extractAfter(str, -); % 返回 10-27_log.csv % 提取两个子串之间的部分 date extractBetween(str, -, _); % 返回 10-27注意它提取了第一个‘-’和第一个‘_’之间的内容 % 提取第5到第10个字符 sub extractBetween(str, 5, 10); % 返回 10-27处理多个分隔符或边界这些函数默认找到第一个匹配的边界就停止。如果你想针对最后一个匹配项操作可以使用last选项。filepath C:\Users\Project\data\experiment.csv; filename extractAfter(filepath, \, last); % 返回 experiment.csv4.3 替换与删除replace,strrep,erase修改文本内容同样重要。replace/strrep(替换子串)将字符串中所有出现的指定旧子串替换为新子串。str I love MATLAB and MATLAB is great.; newStr replace(str, MATLAB, Python); % 返回 I love Python and Python is great. % strrep 是早期函数功能类似但 replace 是字符串类型的成员函数更现代。erase(删除子串)直接移除字符串中所有出现的指定子串。str Hello, [World]!; cleanStr erase(str, [[, ]]); % 返回 Hello, World!实操心得在处理结构化的文本如日志行、配置文件行时我经常组合使用这些函数。例如解析一行日志ERROR 2023-10-27 14:30:22: Connection timeout先用startsWith判断是否是错误日志。用extractBetween提取时间戳部分在两个空格之间的部分可能需要多次提取或结合split。用extractAfter提取冒号后的错误信息。 这种“分而治之”的思路比尝试用一个复杂的正则表达式一次匹配所有部分通常更清晰、更容易调试。5. 核心操作三字符串的分割、连接与大小写变换将字符串拆分成部分或者改变其外观格式也是常规操作。5.1 分割字符串split函数split函数根据指定的分隔符将字符串分割成更小的部分返回一个字符串数组。csvLine Alice,25,Engineer,New York; fields split(csvLine, ,); % 返回 4×1 string 数组: [Alice; 25; Engineer; New York] % 默认分隔符是空白字符空格、制表符、换行符等 sentence The quick brown fox; words split(sentence); % 返回 4×1 string 数组: [The; quick; brown; fox]split函数非常强大它还可以指定分割次数split(str, delimiter, N)只分割前N次并且其分隔符可以是正则表达式见下文这为处理复杂分隔情况如连续多个空格或标点提供了可能。5.2 连接字符串数组join函数回顾如前所述join是split的逆操作。它将一个字符串数组的元素用指定的分隔符连接成一个字符串。pathParts [C:, Users, Me, Documents]; fullPath join(pathParts, \); % 返回 C:\Users\Me\Documents % 注意在Unix/Linux/macOS系统上应使用 / 作为分隔符。 % 更跨平台的做法是使用 filesep 函数join(pathParts, filesep)5.3 大小写与空格处理lower,upper,strtrim,strip这些函数用于规范化文本在数据清洗和比较时尤其有用。lower/upper(转换大小写)将字符串转换为全小写或全大写。在进行不区分大小写的比较时通常先将字符串转为统一大小写。str Hello World; lowerStr lower(str); % hello world upperStr upper(str); % HELLO WORLDstrtrim/strip(去除空白)strtrim移除字符串开头和结尾的所有空白字符空格、制表符、换行符等。dirtyStr Some text with spaces around. \t\n; cleanStr strtrim(dirtyStr); % 返回 Some text with spaces around.strip(R2016b及以上)功能更强大可以指定要移除的字符并且可以选择从开头移除(left)、从结尾移除(right)或两端移除(both默认)。str ***Hello***; cleanStr strip(str, *); % 返回 Hello cleanLeft strip(str, *, left); % 返回 Hello***6. 核心操作四正则表达式——文本处理的终极武器当简单的查找、分割无法满足需求时比如你要匹配一个复杂的模式如电子邮箱地址、电话号码、特定格式的日期正则表达式Regular Expression就是你的终极武器。MATLAB通过regexp、regexpi、regexprep等函数提供了完整的正则表达式支持。6.1 正则表达式基础与regexp函数正则表达式是一种用特定语法描述文本模式的强大工具。regexp函数用于在字符串中查找匹配正则表达式的子串。text My email is aliceexample.com and phone is (123) 456-7890.; % 匹配邮箱地址一个简化版模式 emailPattern \w\w\.\w; emailMatch regexp(text, emailPattern, match); % emailMatch 是一个细胞数组: {aliceexample.com} % 匹配电话号码北美格式 phonePattern \(\d{3}\)\s*\d{3}-\d{4}; phoneMatch regexp(text, phonePattern, match); % phoneMatch: {(123) 456-7890}\w匹配单词字符字母、数字、下划线。匹配前面的元素一次或多次。\.匹配字面点号.在正则中.是特殊字符需转义。\d匹配数字。{3}匹配前面的元素恰好3次。\s匹配空白字符。*匹配前面的元素零次或多次。\(和\)匹配字面括号。regexp的输出可以通过第三个参数控制match返回匹配的文本start返回匹配开始的位置索引end返回结束位置tokens用于提取分组捕获的内容非常有用。6.2 使用regexpi进行不区分大小写匹配regexpi的语法和功能与regexp完全相同唯一的区别是它进行不区分大小写的匹配。当你需要查找“error”、“Error”、“ERROR”时用regexpi会更方便。6.3 使用regexprep进行查找与替换regexprep是正则表达式版本的replace函数允许你使用复杂的模式进行查找和替换。text The price is $19.99 and $299.99.; % 将美元价格替换为‘[PRICE]’ newText regexprep(text, \$\d\.\d{2}, [PRICE]); % 返回 The price is [PRICE] and [PRICE].你还可以在替换字符串中使用捕获组用圆括号()定义的内容。% 将日期格式从 YYYY-MM-DD 改为 DD/MM/YYYY dateStr Today is 2023-10-27.; newDateStr regexprep(dateStr, (\d{4})-(\d{2})-(\d{2}), $3/$2/$1); % 返回 Today is 27/10/2023. % 这里 $1, $2, $3 分别对应第一个、第二个、第三个捕获组的内容。6.4 正则表达式实战技巧与避坑指南正则表达式功能强大但语法晦涩容易出错。以下是一些实战心得从简单开始逐步复杂化不要试图一开始就写出完美的复杂表达式。先匹配一部分测试再添加更多条件。MATLAB的实时编辑器Live Editor非常适合做这种迭代测试。善用在线工具在编写复杂正则时可以使用在线正则表达式测试工具如 regex101.com将你的样例文本和模式放进去它能高亮显示匹配结果并解释每个部分的意义极大地帮助调试。注意MATLAB字符串中的转义在MATLAB字符串中反斜杠\本身也是转义字符如\n表示换行。因此在正则表达式中表示一个字面的反斜杠需要写两个\\。表示正则的\d在MATLAB字符串中要写成\\d。这是最常见的错误来源之一。优先使用更简单的字符串函数如果contains、split、extractBetween能解决的问题就不要用正则表达式。正则表达式虽然强大但可读性差运行开销也相对较大。使用dotexceptnewline等选项正则表达式的点号.默认匹配任何字符包括换行符。如果你不希望它匹配换行符可以在regexp中设置选项dotexceptnewline。7. 实战场景一文件与路径操作字符串处理在文件操作中应用极广。MATLAB提供了完整的路径处理函数集。7.1 路径的分解与组合fileparts,fullfilefileparts将完整文件路径分解为文件夹路径、文件名和扩展名。fullPath C:\MyProject\data\experiment_001.csv; [filepath, name, ext] fileparts(fullPath); % filepath: C:\MyProject\data % name: experiment_001 % ext: .csv这个函数是解析用户输入文件路径或处理已知文件路径的起点。fullfile跨平台地构建完整文件路径。它会自动根据操作系统使用正确的文件分隔符Windows用\Unix/Linux/macOS用/。folder C:\MyProject; subfolder results; filename output.dat; fullPath fullfile(folder, subfolder, filename); % 在Windows上返回 C:\MyProject\results\output.dat % 在Linux上返回 C:/MyProject/results/output.dat强烈建议在所有构建路径的地方使用fullfile而不是手动拼接字符串这能保证代码的跨平台兼容性。7.2 文件名的批量处理经常需要批量处理一组文件例如读取某个文件夹下所有特定格式的文件。% 获取文件夹下所有 .csv 文件 dataFolder C:\Data\Experiment; files dir(fullfile(dataFolder, *.csv)); % dir 返回一个结构体数组 % files.name 字段包含了文件名不含路径 % 构建完整的文件路径列表 filePaths fullfile(dataFolder, {files.name}); % 使用细胞数组 {files.name} 一次处理所有文件名 % 假设我们想从文件名 data_20231027_run1.csv 中提取日期和运行号 for i 1:length(filePaths) [~, name, ~] fileparts(filePaths(i)); % 提取不带扩展名的文件名 % 使用正则表达式提取日期和运行号 tokens regexp(name, data_(\d{8})_run(\d), tokens); if ~isempty(tokens) dateStr tokens{1}{1}; % 例如 20231027 runNum str2double(tokens{1}{2}); % 例如 1 fprintf(Processing file from date %s, run %d\n, dateStr, runNum); % 接下来可以读取 filePaths(i) 并进行处理... end end这个例子综合运用了dir、fullfile、fileparts、regexp和str2double是自动化数据流水线中的典型模式。8. 实战场景二文本数据清洗与解析从文件如日志、CSV、JSON或网络读取的原始文本数据往往包含噪音需要进行清洗才能用于分析。8.1 清洗非标准CSV或日志数据假设你从仪器导出的数据文件每行可能有不规则的空白、注释行以#开头或无效字符。% 模拟读取的原始文本行细胞数组形式 rawLines { # Experiment Log; Time: 2023-10-27 10:00:00 ; SensorA: 23.4, SensorB: 45.6, Status: OK; ; Time: 2023-10-27 10:05:00; SensorA: 24.1, SensorB: 46.2, Status: OK # slight drift; }; cleanData {}; for i 1:length(rawLines) line strtrim(rawLines{i}); % 1. 去除首尾空白 if isempty(line) || startsWith(line, #) continue; % 2. 跳过空行和注释行 end % 3. 移除行内注释如果有 commentIdx strfind(line, #); if ~isempty(commentIdx) line extractBefore(line, commentIdx(1)); line strtrim(line); % 再次修剪 end % 4. 现在 line 是干净的数据行可以进一步解析 % 例如解析键值对... cleanData{end1} line; % 存入清洗后的列表 end disp(cleanData)8.2 解析结构化文本如键值对、简单JSON对于简单的非标准格式可以结合split和strip进行解析。% 解析上面清洗后的一行数据: SensorA: 23.4, SensorB: 45.6, Status: OK dataLine cleanData{2}; % 假设取第二行 pairs split(dataLine, ,); % 按逗号分割成键值对 dataStruct struct(); for j 1:length(pairs) kv split(pairs(j), :); % 按冒号分割键和值 if length(kv) 2 key strtrim(kv(1)); % 键如 SensorA value strtrim(kv(2)); % 值如 23.4 % 尝试将值转换为数字如果失败则保留字符串 numValue str2double(value); if ~isnan(numValue) dataStruct.(key) numValue; else dataStruct.(key) value; end end end disp(dataStruct) % 输出包含字段的结构体: SensorA: 23.4, SensorB: 45.6, Status: OK对于复杂的JSON或XMLMATLAB有内置的jsondecode和xmlread函数它们会将文本解析为MATLAB的数据结构如结构体、细胞数组这比手动进行字符串解析要可靠和高效得多。字符串处理技能在这里用于预处理或后处理这些解析器产生的数据。9. 常见问题与排查技巧实录即使掌握了所有函数在实际编码中还是会遇到各种“坑”。下面是我在多年使用中总结的一些典型问题和解决方法。9.1 字符数组与字符串数组的混淆问题代码中对一个变量使用了strlength函数但报错“未定义函数或变量 ‘strlength’”。或者使用拼接时得到数字相加的结果。诊断与解决这几乎总是因为变量是char数组而不是string数组。strlength是string类的方法。% 错误示例 myText Hello; % char array len strlength(myText); % 在旧版本MATLAB或myText为char时会报错或行为异常 % 正确做法1转换为string myText string(Hello); len strlength(myText); % 返回 5 % 正确做法2对char使用length但注意length返回数组最长维的长度对多行char不一定是字符数 myText Hello; len length(myText); % 返回 5 (对于单行字符数组等于字符数) % 但对于多行字符数组length返回的是行数此时应用 size(myText, 2) 获取列数字符数。排查技巧在调试时随时使用class(var)和whos var命令查看变量的类型和大小。养成在脚本开头或关键步骤检查数据类型的习惯。9.2 使用strfind与contains的预期不符问题用strfind在一个字符串数组中查找返回的是一个复杂的细胞数组而不是简单的逻辑索引导致后续索引操作出错。诊断与解决strfind的设计就是返回位置信息对于非标量输入它返回细胞数组。如果你只需要知道“是否存在”应该使用contains。list [apple, banana, cherry]; % 如果你想找到包含‘na’的元素 idx_cell strfind(list, na); % 返回 {[], [3, 5], []}很难直接用于索引 logical_idx contains(list, na); % 返回 [false, true, false]可直接用于逻辑索引 result list(logical_idx); % 返回 banana9.3 正则表达式匹配结果为空或过多问题精心编写的正则表达式要么匹配不到任何内容要么匹配了太多不该匹配的内容。诊断与解决转义问题确保在MATLAB字符串中正确转义了反斜杠。例如匹配一个字面的点号应该用\.在MATLAB字符串中要写成\\.。贪婪匹配正则表达式的量词如*,,?默认是“贪婪”的会匹配尽可能多的字符。这有时会导致匹配范围过大。使用非贪婪量词如*?,?可以匹配尽可能少的字符。str titleMy Page/title and bodyContent/body; % 贪婪匹配 greedyMatch regexp(str, .*, match); % 可能匹配到整个 titleMy Page/title and bodyContent/body因为它从第一个‘’匹配到最后一个‘’。 % 非贪婪匹配 lazyMatch regexp(str, .*?, match); % 会分别匹配到 title, /title, body, /body。使用在线调试器将你的测试字符串和模式复制到 regex101.com 这样的网站它能直观地显示匹配过程并解释每个元字符的含义是调试正则表达式不可或缺的工具。9.4 处理包含空字符串的数组问题在对字符串数组进行操作如strlength后空字符串的长度为0但在逻辑索引中空字符串是true因为在逻辑上下文中不被视为false。这可能导致意外的筛选结果。诊断与解决使用strlength函数来显式地检查字符串是否为空而不是依赖逻辑判断。strArray [hello, , world, ]; % 错误试图移除空字符串 nonEmpty strArray(strArray); % 这不会工作因为 strArray 是字符串数组不能直接用于逻辑索引 % 正确 nonEmpty strArray(strlength(strArray) 0); % 返回 [hello, world]9.5 路径操作中的跨平台兼容性问题在Windows上写的脚本使用反斜杠\拼接路径到了Linux或macOS上就无法运行。解决始终坚持使用fullfile函数来构建路径。它自动处理系统差异。同样使用filesep函数来获取当前系统的文件分隔符如果你需要手动拼接的话。% 推荐做法 correctPath fullfile(project, data, input.csv); % 如果需要获取分隔符 sep filesep; % 在Windows上是‘\’在Unix上是‘/’避免在代码中硬编码\或/作为路径分隔符。
返回列表