当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
。有没有人对如何实现这一目标有任何想法?
答案 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