从分类数组转向二进制矩阵

Lea*_*res 2 arrays performance matlab for-loop vectorization

我有一个数组,其中包含一些属于集合的值.我想在二进制矩阵中转换此数组,此矩阵的每一列将表示该集合的每个可能值,对于与输入数组匹配的列,行值为1,对于所有其他列,行值为0.我认为这个名字就像二元枢轴.

输入数组是表类型的列

输入数组的示例(前面的示例只是大写字母,导致误解):

'Apple'
'香蕉'
'樱桃'
'Dragonfruit''Apple
'
'樱桃'

所以,在这个例子中,输入可以假设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
Run Code Online (Sandbox Code Playgroud)

对于包含9个类别的约50,000个条目,它在0.075137秒内执行.

编辑:我改进了这些例子,因为之前的例子导致了误解.

bro*_*oll 5

这是我对这个问题的看法:

input = ['ABCDAB']';
binMatrix = bsxfun(@eq,input,unique(input)');
Run Code Online (Sandbox Code Playgroud)

对于基准测试,我在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);
Run Code Online (Sandbox Code Playgroud)

这给了我0.001203秒.有关方法的广泛比较,请参阅@ ryaryeng的答案.