使用字符串矩阵时会产生平等

Ste*_*and 2 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
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)

ray*_*ica 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
Run Code Online (Sandbox Code Playgroud)

当你这样做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.
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)