【问题标题】:Why doesn't strcmp recognize two seemingly equal strings as the same?为什么 strcmp 不能将两个看似相等的字符串识别为相同的?
【发布时间】: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 strcmp


    【解决方案1】:

    最可能的原因是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.fhandlestr2func(str) 都指向同一个已定义的函数TBMA3。与f = @(x)x; g = @(x)x, isequal(f,g) 比较,得到0。这种行为是explained in the documentation。感谢@knedlsepp 帮助澄清这一点。

    【讨论】:

    • 比较你可以这样做:strcmp ( func2str(method.fhandle), 'TBMA3' )。另一种可能性是其中一个字符串后面有空格...
    • @matlabgui 谢谢。在这方面,我正在精确地编辑我的答案。但是您需要从str 中删除'@'。我认为反过来更好:将str 转换为函数句柄(然后与isequal 进行比较;参见编辑后的答案)
    • @LuisMendo:我认为您无法“按值”比较函数句柄是否相等。 isequal(@(x) x, @(x) x) 对我来说失败了。编辑:嗯,好的,如果它是一个 m.file 这可能会起作用,因为句柄被比较为参考。得分。
    • 当然。但是由于 OP 可能想比较一些非匿名函数,所以不转换为字符串当然是最好的方法!
    • @knedlsepp 原来这在文档中有解释:es.mathworks.com/help/matlab/matlab_prog/…
    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多