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秒内执行.
编辑:我改进了这些例子,因为之前的例子导致了误解.
这是我对这个问题的看法:
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的答案.
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |