我不明白为什么使用==
来比较字符串向量和字符串矩阵并且向量具有维度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
下面发生了什么来解释这样的结果?是否可以取消警告: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
答案 0 :(得分:7)
实际发生的是您正在创建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
执行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.
但是,你可以消除"警告"通过使用bsxfun
(MATLAB doc,Octave doc)执行适当的广播。这适用于两个平台。
在Octave:
octave:4> bsxfun(@eq, t, "aha")
ans =
1 1 1
0 0 0
0 0 0
在MATLAB中:
>> bsxfun(@eq, t, 'aha')
ans =
1 1 1
0 0 0
0 0 0
对于整数的情况,单个数字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
函数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