【发布时间】:2015-04-02 14:23:23
【问题描述】:
下面是 Matlab 控制台的输出。两个字符串相同:'@TBMA3'。然而 Matlab 的 strcmp 函数在比较它们时返回 0。为什么?
K>> str='@TBMA3'
str =
@TBMA3
K>> method.fhandle
ans =
@TBMA3
K>> strcmp(method.fhandle, str)
ans =
0
【问题讨论】:
下面是 Matlab 控制台的输出。两个字符串相同:'@TBMA3'。然而 Matlab 的 strcmp 函数在比较它们时返回 0。为什么?
K>> str='@TBMA3'
str =
@TBMA3
K>> method.fhandle
ans =
@TBMA3
K>> strcmp(method.fhandle, str)
ans =
0
【问题讨论】:
最可能的原因是method.fhandle 不是字符串,而是函数句柄。检查class(method.fhandle)是否给出
ans =
function_handle
在这种情况下,比较结果为 0,因为字符串 (str) 不能等于函数句柄 (method.fhandle)。
为了检查是否相等,您需要将method.fhandle 转换为字符串,或将str 转换为函数句柄。第一个选项是不够的,因为char(function_handle) 将给出'TBMS3',而没有'@'。所以使用第二个选项,并使用isequal进行比较:
isequal(method.fhandle, str2func(str))
应该给1。†
† 这个isequal 比较有效,因为method.fhandle 和str2func(str) 都指向同一个已定义的函数TBMA3。与f = @(x)x; g = @(x)x, isequal(f,g) 比较,得到0。这种行为是explained in the documentation。感谢@knedlsepp 帮助澄清这一点。
【讨论】:
strcmp ( func2str(method.fhandle), 'TBMA3' )。另一种可能性是其中一个字符串后面有空格...
str 中删除'@'。我认为反过来更好:将str 转换为函数句柄(然后与isequal 进行比较;参见编辑后的答案)
isequal(@(x) x, @(x) x) 对我来说失败了。编辑:嗯,好的,如果它是一个 m.file 这可能会起作用,因为句柄被比较为参考。得分。