我有一个数组,其中包含一些属于集合的值。我想将这个数组转换为二进制矩阵,该矩阵的每一列将代表该集合的每个可能值,对于与输入数组匹配的列,行值为 1,对于所有其他列,行值为 0。我认为它的名称类似于二进制枢轴。
输入数组是表类型的列
输入数组示例(前面的示例仅是大写字母,导致误解):
“苹果”
“香蕉”
“樱桃”
'火龙果'
“苹果”
“樱桃”
因此,在此示例中,输入可以采用 4 个不同的值:“Apple”、“Banana”、“Cherry”或“Dragonfruit”,在我的实际场景中,它可能会超过 4 个。
输出矩阵示例:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
1 0 0 0
0 0 1 0
我已经实现了这个期望的行为,但我想知道是否有更好的方法来执行此操作。以矢量化方式(每个类别没有 for 循环)或使用内置函数。
function [ binMatrix, categs ] = pivotToBinaryMatrix( input )
categorizedInput = categorical(input);
categs = categories(categorizedInput);
binMatrix = zeros(size(atributo, 1), size(categorias, 1));
for i = 1: size(caters,1)
binMatrix(:,i) = ismember(categorizedInput, categs(i));
end
end
对于 9 个类别的约 50.000 个条目,它的执行时间为 0.075137 秒。
编辑:我改进了这些示例,因为前面的示例导致了误解。
最佳答案
这是我对这个问题的看法:
input = ['ABCDAB']';
binMatrix = bsxfun(@eq,input,unique(input)');
为了进行基准测试,我在 Windows 7 计算机、4Gb RAM、Intel i7-2600 CPU 3.4 GHz 上运行它,借用 @rayryeng 初始化代码:
% Generate dictionary from A up to I
ch = char(65 + (0:8));
rng(123);
% Generate 50000 random characters
v = randi(9, 50000, 1);
inputArray = ch(v);
time=0;
for ii=1:100
tic;
binMatrix = bsxfun(@eq,inputArray,unique(inputArray)');
t = toc;
time=time+t;
end
disp(time/100);
这给了我 0.001203 秒。有关方法的广泛比较,请参阅@ryaryeng 的回答。
关于arrays - 从分类数组转换为二进制矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29909411/