我不明白为什么使用==比较字符串向量和字符串矩阵并且向量是维度的n,我得到一个大小的矩阵n * n.我预计它n只有大小,当字符串相等时为1.
octave:13> t = ["aha";"bgb";"ctc"]
t =
aha
bgb
ctc
octave:14> t == "aha"
warning: mx_el_eq: automatic broadcasting operation applied
ans =
1 1 1
0 0 0
0 0 0
Run Code Online (Sandbox Code Playgroud)
下面发生了什么来解释这样的结果?是否有可能取消警告:warning: mx_el_eq: automatic broadcasting operation applied?
例如,使用整数向量,它的行为与我期望的一样:
octave:16> t2 = [1,2,2,3,4]
t2 =
1 2 2 3 4
octave:17> t2 == 4
ans =
0 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
实际发生的是你正在创建一个3 x 3字符矩阵.
确定矩阵的类以及矩阵中相应的行数和列数时,请观察:
octave:1> t = ["aha";"bgb";"ctc"]
t =
aha
bgb
ctc
octave:2> class(t)
ans = char
octave:3> size(t)
ans =
3 3
Run Code Online (Sandbox Code Playgroud)
当你这样做t == "aha",通常当你执行逻辑运算,无论是左手和表达的右手边应该匹配的大小.每个变量的大小在大小上匹配,因为执行了逐元素比较.但是,因为"aha"是一个3 x 1字符数组而你的数组t是3 x 3,所以Octave将自动广播,以便比较大小匹配.这意味着"aha"将转换为3 x 3矩阵,您可以在其中看到"aha"每行中的字符串.这就是为什么你得到一个3 x 3逻辑矩阵,其中第一行全部为真,因为你是在个别基础上比较字符,结果是第一行t匹配逐字符,转换后的"aha"矩阵沿着第三行重复倍.您在Octave中收到此警告但在MATLAB中,您会立即收到错误,因为尺寸与尺寸不匹配.
这就是MATLAB中发生的事情.请注意,字符串是使用单引号创建的,而不是双引号.
>> t = ['aha';'bgb';'ctc']
t =
aha
bgb
ctc
>> t == 'aha'
Error using ==
Matrix dimensions must agree.
Run Code Online (Sandbox Code Playgroud)
但是,您可以通过使用bsxfun(MATLAB doc,Octave doc)执行适当的广播来消除"警告" .这适用于两个平台.
在Octave:
octave:4> bsxfun(@eq, t, "aha")
ans =
1 1 1
0 0 0
0 0 0
Run Code Online (Sandbox Code Playgroud)
在MATLAB中:
>> bsxfun(@eq, t, 'aha')
ans =
1 1 1
0 0 0
0 0 0
Run Code Online (Sandbox Code Playgroud)
对于整数的情况,单个数字4是明确定义的并且执行t2 == 4是隐含的行为,因此您不会收到警告.我们知道我们需要将元素与每个元素进行比较,t2以查看每个位置是否匹配4.
为了做你真正想要的事情,霍克勒做了一个很好的观察.将字符矩阵转换为单元格数组,其中此数组中的每个元素都是由矩阵中的整行字符组成的字符串,然后strcmp在单个字符串和字符单元格数组之间使用.它将返回一个n执行您想要的长度的逻辑向量:
octave:5> strcmp(mat2cell(t,ones(1,size(t,1)),size(t,2)),'aha')
ans =
1
0
0
Run Code Online (Sandbox Code Playgroud)
函数mat2cell(MATLAB doc,Octave doc)将矩阵转换为单元数组.我们在这里做的是确定如何填充单元格数组.我们说每个单元格数组的内容应该是1 x size(t,2)其中size(t,2)的总列数t.然后我们使用strcmp(MATLAB doc,Octave doc)将此单元数组中的每个字符串与字符串进行比较"aha".返回的是您期望的逻辑向量.
更简单的是立即创建字符串的单元格数组,然后只strcmp对此单元格数组执行:
octave:6> t = {"aha"; "bgb"; "ctc"}
t =
{
[1,1] = aha
[2,1] = bgb
[3,1] = ctc
}
octave:7> strcmp(t,"aha")
ans =
1
0
0
Run Code Online (Sandbox Code Playgroud)