【问题标题】:How to convert string variable into boolean in Matlab?如何在 Matlab 中将字符串变量转换为布尔值?
【发布时间】:2016-10-06 07:52:21
【问题描述】:

我有一个 matlab 脚本,其中一个变量是:

a = 'false' % my string

我的目标是将此类变量转换为布尔变量:

a = false % my goal

是否有一个 matlab 函数可以让我将字符串转换为布尔值?

a = string2boolean('false') % I would like to have something like this

如果没有允许这样做的功能,还有什么可能的解决方案?

【问题讨论】:

  • 在 Matlab 中它被称为logical。它总是“真”还是“假”?为什么不只是strcmpi(a,'true')
  • 使用~strcmp(a, 'false')

标签: string matlab boolean type-conversion


【解决方案1】:

你可以自己写一个,比较简单

function [output]=string2boolean(string)
   if strcmp(string,'false')
     output = false;
   else
     output = true;
   end
end

此外,您可以完全跳过该功能,只需简单地

a = strcmp(a,'true'); 

【讨论】:

  • 或者,如果 OP 想要更简单一点:string2boolean = @(s) ~strcmpi(s, 'false');
  • @StewieGriffin 这更短,但并不简单。特别是对于初学者来说,上面的代码更具可读性。
【解决方案2】:

您可以为此滥用strcmpi,即

 a = strcmpi(a, 'true');

这是一个不区分大小写的字符串比较,所以trueTrueTRUE都被转换为逻辑真。所有其他字符串将自动转换为 false。

【讨论】:

  • @Federico:还有a = ~strcmpi(a, 'false')。如果a = 'false',则给出a = false
  • @StewieGriffin 我写的那一行也给出了a = false if a='false',没有理由写那么多余。
  • 'abc'[1 2 3] 也是如此。除了'true''false' 之外,可能还有其他选项,因为 OP 没有回答您在 cmets 中提出的问题。 PS!我并不是说 OP 应该有 both 'true''false'。但这是“保证”回答 OP 问题的 'false' 部分。 'true' 版本可能是错误的(但可能不是)。
  • 这很奇怪。如果您创建一个将某些内容转换为布尔值的函数,它应该给出truefalse。但是 Matlab 不是类型安全的,所以你确实可以返回任何东西。但是,对于您的函数的未来用户来说,这将是意想不到的行为。
  • 我同意,但是有很多奇怪的做事方式。假设 OP 有:if x == 0; y = [1, 2, 3]; else y = 'false'; end。另外,我同意,它应该将其转换为truefalse,但有可能所有不是为假的都是真的,而不是相反。
【解决方案3】:

str2num 有效(使用 Matlab R2018a 测试)

str2num( '1' ) %yields double(1)
str2num( '0' ) %yields double(0)
str2num( 'true' ) %yields logical(1)
str2num( 'false' ) %yields logical(0)

【讨论】:

    【解决方案4】:

    您可以如下定义方法/函数:

    function boolValue = string2boolean(stringValue)
    
        boolValue = ''
        if strcmpi(string,'false')
            boolValue = false
        end
    
        if strcmpi(string,'true')
            boolValue = true
        end
    

    【讨论】:

    • 你测试过你的功能吗?这行不通,您正在if-statement 中进行分配。
    • @Bernhard 感谢指出,其实我只是逻辑思维提供了这个,我没有在MATLAB中运行过,所以赋值运算符修正后,代码会正常运行。
    • 比较运算符在 Matlab 中的工作方式不一样。考虑删除你的答案,这没有意义。
    • 如果您将== 更改为strcmp,这将是有意义的,但这将是另一个答案的简单副本。我同意@Bernhard 的观点。
    • 我真的很惊讶一个简单的错误答案比两个正确答案吸引了更多的赞成票。
    【解决方案5】:

    使用ismember:

    str = "true";   % 'true' also works
    ismember(lower(str), {'true','1'})    % returns 1
    

    这允许使用 Matlab 的 logical 原生支持的其他真值:

    str = 'yes';
    ismember(lower(str), {'true','1','yes','enable'})  % returns 1
    

    【讨论】:

      猜你喜欢
      • 2016-05-09
      • 2011-02-17
      • 2012-04-02
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      相关资源
      最近更新 更多