我正在进行一些分类,因此需要将整数代码转换为字符串。我写了这样的话:
s(1).class = 1;
s(2).class = 7;
s(3).class = 9;
[s([find([s.class] == 1)]).class] = deal('c1'); %first conversion
[s([find([s.class] > 1)]).class] = deal('c2'); %second conversion
并且惊讶地发现在第二次转换后s是1x4结构数组而不是具有值的预期1x3结构数组。
现在,经过一些研究,我了解到,在第一次转换后,s(1).class
的值为'c1'
,而第二次转化中find
的参数不是我认为的那样。 [s.class]
语句实际上返回类似字符串'c1\a\t'
的字符串,用于响铃和水平制表符的ASCII转义序列。
由于比较确实有效(返回矩阵[1 1 1 1]
并因此扩展我的结构),我假设matlab转换操作数[s.class]
或操作数1
。
这是什么?这里的数字或字符实际上是什么?
另一方面,有一种内置的方式可以使>
更具限制性,i。即要求操作数是相同的类型,如果不是要抛出错误?
答案 0 :(得分:2)
进行比较'ab' > 1
时,char
数组'ab'
会转换为double
数组,即字符的ASCII代码。因此,'ab' > 1
相当于double('ab') > 1
,后者为[1 1]
。
要获得所需的行为(如果其中一个参数为char
,则发出错误),您可以定义一个函数:
function z = greaterthan(x,y)
if ischar(x) || ischar(y)
error('Invalid comparison: one of the input arguments is of type char')
else
z = x>y;
end
这样
>> greaterthan([0 1 2], 1)
ans =
0 0 1
>> greaterthan('ab', 1)
??? Error using ==> greaterthan at 3
Invalid comparison between char and int
答案 1 :(得分:0)
因为你还没有提供任何预期的输出,我将继续观察。
您正在使用理解方法(通过调用find
)来确定将使用方法s
的结果为struct deal
填充哪些位置(采用参数{{ 1}}和c1
)。您已经在您提供的第一个代码段中为s {whatever).class设置了类型。这意味着它是你要比较的数字,而不是字符。
有c2
函数可以查看变量属于哪个类。用它来看你实际投入的是什么(对于你的情况应该说是int32)。