如何在Matlab中将字符串变量转换为布尔值?

4

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

a = 'false' % my string

我的目标是将这个变量转换成布尔变量:

a = false % my goal

有没有一个Matlab函数可以将字符串转换为布尔值?
a = string2boolean('false') % I would like to have something like this

如果没有允许做到这一点的功能,可能会有另一个解决方案吗?

2
在Matlab中,它被称为“逻辑型”。它总是“true”或“false”吗?为什么不直接使用strcmpi(a,'true') - Bernhard
1
使用~strcmp(a, 'false') - erfan
5个回答

5
你可以误用 strcmpi 实现这个功能,也就是说
 a = strcmpi(a, 'true');

这是一种不区分大小写的字符串比较,因此trueTrueTRUE都会被转换为逻辑上的true。所有其他字符串将自动转换为false。

@Federico:并且 a = ~strcmpi(a, 'false')。如果 a = 'false',则会得到 a = false - Stewie Griffin
@StewieGriffin 我写的那行代码,如果 a='false' ,也会得到 a = false,没有必要这样写得过于冗余。 - Bernhard
所以'abc'[1 2 3]也是可能的选项。由于OP没有回答您在评论中提出的问题,因此可能存在其他选项而不仅仅是“true”和“false”。PS!我并不是说OP应该同时拥有“true”和“false”。但是,“false”部分是“保证”的可以回答OP问题的部分。“true”版本可能是错误的(但很可能不是)。 - Stewie Griffin
这很奇怪。如果你编写一个将某些东西转换为布尔值的函数,它应该返回truefalse。但是Matlab不是类型安全的,所以你确实可以返回任何东西。然而,这将会对未来使用你的函数的用户产生意外的行为。 - Bernhard
我同意,但有很多奇怪的方法来做事情。假设 OP 有:if x == 0; y = [1, 2, 3]; else y = 'false'; end。同时,我同意,它应该转换为 truefalse,但可能所有不是 false 的东西都是 true,而不是相反。 - Stewie Griffin
显示剩余2条评论

5
你可以自己写一个,这很简单。
function [output]=string2boolean(string)
   if strcmp(string,'false')
     output = false;
   else
     output = true;
   end
end

此外,您可以完全跳过该函数,直接进行操作。
a = strcmp(a,'true'); 

2
或者,如果 OP 想要更简单一些:string2boolean = @(s) ~strcmpi(s, 'false'); - Stewie Griffin
2
@StewieGriffin 这是更短,但不是更简单。对于初学者来说,上面的代码更易读。 - Stefan

4

str2num可用(已在Matlab R2018a中进行测试)

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

0
你可以按照以下方式定义一个方法/函数:
function boolValue = string2boolean(stringValue)

    boolValue = ''
    if strcmpi(string,'false')
        boolValue = false
    end

    if strcmpi(string,'true')
        boolValue = true
    end

你有测试过你的函数吗?这是不可能工作的,你正在if语句中进行赋值。 - Bernhard
@Bernhard 感谢您的指出,实际上我只是通过逻辑思考提供了这个代码,并没有在MATLAB中运行过。所以,在修正赋值运算符之后,代码将能够正确运行。 - krishna Prasad
1
比较运算符在Matlab中不是这样使用的。请考虑删除您的答案,它没有意义。 - Bernhard
如果你把“==”改成“strcmp”会更合理,但那样它就和其他答案没有区别了。我同意@Bernhard的看法。 - Stewie Griffin
@StewieGriffin @Bernhard,应该使用strcmpi而不是添加strcmp,这样可以忽略字母大小写的差异。我最初回答这个问题是为了在逻辑上实现问题的要求,而不是通过运行代码来实现。 - krishna Prasad
显示剩余2条评论

0
使用 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

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接