uint类型之间的强制

时间:2015-09-22 04:20:28

标签: matlab type-conversion

当Matlab无法解决如何逻辑存储不同uint类型的值时,我遇到了一个问题。例如:

tempC = {uint8(5) uint16(16)}

对我来说,能够使用cell2mat(tempC)将其转换为整数类型的矩阵似乎是合乎逻辑的,它返回

>> cell2mat(tempC)
Error using cell2mat (line 45)
All contents of the input cell array must be of the same data type.

当然,我理解整数的截断行为取决于类型(例如uint8强制所有大于255的数字为255),但是,在这种情况下我会说它足够安全以cell2mat(tempC)类型输出uint16。有没有人对如何实现这一目标有任何想法?

1 个答案:

答案 0 :(得分:1)

如果存在不同类型的单元格,

cell2mat将无效。 cell2mat将单元格合并为一个矩阵,但MATLAB 中的矩阵元素必须共享相同的类型。这是MATLAB如何使用数字矩阵的基础。如果你没有所有相同的类型,那么你应该使用单元格数组......这就是它们的用途。

但是,我可以建议的一件事是找出矩阵中所有元素的类型,然后迭代每个单元格并将它们全部转换为最大的精度类型。然后,您可以在此中间结果上使用cell2mat来完成转换。但是,我所写的内容实际上并不需要最后调用cell2mat。你稍后会看到。

这样的事情:

%// Get all of the possible types in the array
types = unique(cellfun(@class, tempC, 'uni', 0));

%// Figure out the largest type
vals = cellfun(@(x) double(intmax(x)), types);
[~,ind_max] = max(vals);

%// Cast all values to this type
class_max = types{ind_max};
tempC = cellfun(@(x) cast(x, class_max), tempC);

我们首先确定您的单元格数组包含的所有可能类。然后我们找出哪些类型中最大的类型。这可以通过在每种类型上使用intmax来完成。 intmax告诉您可用于该类型的最大可能整数,因此我们基本上选择生成最大可能整数的类型。请注意,我必须转换为double,因为intmax的输出肯定会输出与整数类型关联的最大值,但输出也强制到该类型。这是必需的,这样我就可以将所有这些元素组合成一个相同类型的数组 - double

一旦我们得到产生最大可能整数的类型,我们就会遍历单元格数组并将所有值转换为此类型。请注意,我使用cellfun进行最终调用,输出数字数组 - 此处无需使用cell2mat。在最后一行代码中,我使用cast将单元格数组中的所有数字转换为此类型,从而实现"强制"。

使用您的示例数组,这是我得到的,以及最终数组所在的类:

>> tempC

tempC =

      5     16

>> class(tempC)

ans =

uint16