arrays - 从分类数组转换为二进制矩阵

标签 arrays matlab performance for-loop vectorization

我有一个数组,其中包含一些属于集合的值。我想将这个数组转换为二进制矩阵,该矩阵的每一列将代表该集合的每个可能值,对于与输入数组匹配的列,行值为 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/

相关文章:

php - 在PHP中的每个级别递归排序多维数组

matlab - 在 matlab 中将频率转换为音符

python - 在给定概率函数的情况下绘制贝叶斯决策边界的内置函数

php - 什么是更快的 file_exists 或 DB 检索?

python - Numpy:高级索引的转置结果

arrays - 模式匹配时不会发生从 Array 到 WrappedArray 的隐式转换

javascript - 如何将包含符号的数组转换为字符串?

javascript - 如何在 JQuery 中删除/清空同级并追加

matlab - 哪种方法更好? libsvm 还是 svmclassify?

android - 在 Activity 布局的 Root View 上使用 Android <merge> XML 元素