Matlab regexprep调用同m文件自定义函数报char入参未定义错误
Matlab regexprep动态调用自定义函数报错原因及解决方案
报错根本原因
- 作用域不匹配:regexprep执行
${}包裹的动态替换逻辑时,是在全局基础工作区的上下文下求值的,只能识别独立存为同名m文件、且位于Matlab搜索路径下的函数。你写在当前m文件内的子函数、局部函数都不在这个求值上下文的可见范围内,因此会报「未定义函数」的错误。 - 参数类型隐含差异:regexprep的捕获分组
$n传入动态表达式时,默认传递的是char类型数组,如果你自定义函数的参数处理逻辑对类型有严格要求,也可能触发类型不匹配的报错。你测试时直接传'704'能运行是因为测试时是在当前脚本/函数的上下文内调用,和regexprep的求值上下文完全不同。
修复方案
方案1:内嵌计算逻辑(无需自定义函数,最便捷)
直接把数组长度加倍的逻辑写在替换表达式内,完全避开自定义函数的作用域问题:
% 替换creal_T类型和数组长度 resultString = regexprep(codeText, ... '(?m)^(\W*)creal_T(\s*\w*)\[(\d+)\]', ... "$1double$2[${num2str(str2double($3)*2)}]"); % 替换结构体名 resultString = replace(resultString, "} testType;", "} SpdEstType;");
运行后即可得到你期望的转换结果。
方案2:保留自定义函数的修改方式
如果你需要复用doubleTextNumber函数,做两处修改即可:
- 将
doubleTextNumber函数的代码单独保存为doubleTextNumber.m文件,放在Matlab当前工作路径或已添加的搜索路径下 - 给函数增加char类型兼容处理,避免偶现的类型报错:
function [doubleValue] = doubleTextNumber(inputNumber) % 兼容char类型输入参数 inputNum = str2double(string(inputNumber)); doubleValue = string(inputNum * 2.0); end
修改完成后你原来的regexprep语句即可正常运行。
内容的提问来源于stack exchange,提问作者Håkon Seljåsen
相关产品推荐
相关产品推荐

