matlab - 使用字符串矩阵时结果相等

标签 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

最佳答案

实际发生的是您正在创建一个 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.

但是,您可以通过使用 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 docOctave doc)会将矩阵转换为元胞数组。我们在这里所做的是确定如何填充元胞数组。我们说每个元胞数组的内容应该是 1 x size(t,2) 其中 size(t,2) 中的总列数>t。然后,我们使用 strcmp(MATLAB 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

关于matlab - 使用字符串矩阵时结果相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35976243/

相关文章:

python - 将 python Dataframe 转换为 Matlab 文件

c++ - matlab 生成的 C 函数的用途未知

matlab - 有没有使用Matlab计算Precision和Recall的函数?

matlab - 在 Octave 中加载输入文件并创建向量和矩阵

matlab - 在 Octave 中保存/加载大型矩阵

Matlab:检查目录中的所有图像是否为灰度?

android - 如何将图片从安卓设备传输到 Matlab,反之亦然

java - 尝试在 Octave 中调用 Java 对象

matlab - 不仅仅根据 z 定义曲面

octave - 在 Octave 中编写简单的方程