使用字符串矩阵

时间:2016-03-13 21:44:32

标签: matlab octave

我不明白为什么使用==来比较字符串向量和字符串矩阵并且向量具有维度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

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个字符数组而您的数组t3 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.

但是,你可以消除"警告"通过使用bsxfunMATLAB docOctave 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

函数mat2cellMATLAB docOctave doc)会将矩阵转换为单元格数组。我们在这里做的是确定如何填充单元阵列。我们说每个单元格数组的内容应为1 x size(t,2),其中size(t,2)t中的总列数。然后,我们使用strcmpMATLAB docOctave 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