我不明白为什么使用 ==
来比较字符串向量和字符串矩阵,而向量的维数是 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
最佳答案
实际发生的是您正在创建一个 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
关于matlab - 使用字符串矩阵时结果相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35976243/