Matlab/倍频程1/K表示法
我有一个大小为5000,1(矩阵)的y,它包含1到10之间的整数。我想把这些指数扩展成10取1的向量。也就是说,y包含1,2,3。。。我希望它“扩展”到: 最好的方法是什么 我试过:Matlab/倍频程1/K表示法,matlab,matrix,octave,Matlab,Matrix,Octave,我有一个大小为5000,1(矩阵)的y,它包含1到10之间的整数。我想把这些指数扩展成10取1的向量。也就是说,y包含1,2,3。。。我希望它“扩展”到: 最好的方法是什么 我试过: Y = zeros(5000,10); Y(y) = 1; 但它不起作用 但它适用于向量: 如果y=[2 5 7],并且y=0(1,10),那么y(y)=[0 1 0 1 0 1 0 0 0 0] n=5 Y = ceil(10*rand(n,1)) Yexp = zeros(n,10); Yexp(sub2i
Y = zeros(5000,10); Y(y) = 1;
但它不起作用
但它适用于向量:
如果y=[2 5 7]
,并且y=0(1,10)
,那么y(y)=[0 1 0 1 0 1 0 0 0 0]
n=5
Y = ceil(10*rand(n,1))
Yexp = zeros(n,10);
Yexp(sub2ind(size(Yexp),1:n,Y')) = 1
也可以考虑使用稀疏,如::
< P>我想你的意思是:y = [2 5 7];
Y = zeros(5000,10);
Y(:,y) = 1;
编辑问题后,应改为:
y = [2,5,7,9,1,4,5,7,8,9....]; //(size (1,5000))
for i = 1:5000
Y(i,y(i)) = 1;
end
考虑以下几点:
y = randi([1 10],[5 1]); %# vector of 5 numbers in the range [1,10]
yy = bsxfun(@eq, y, 1:10)'; %# 1-of-10 encoding
例如:
>> y'
ans =
8 8 4 7 2
>> yy
yy =
0 0 0 0 0
0 0 0 0 1
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
1 1 0 0 0
0 0 0 0 0
0 0 0 0 0
虽然稀疏可能会更快并节省内存,但涉及eye()的答案会更优雅,因为它比循环快,并且是在该课程的八度课程中介绍的 下面是1到4的示例
V = [3;2;1;4];
I = eye(4);
Vk = I(V, :);
您可以尝试cellfun操作:
function vector = onehot(vector,decimal)
vector(decimal)=1;
end
aa=zeros(10,2);
dec=[5,6];
%split into columns
C=num2cell(aa,1);
D=num2cell(dec,1);
onehotmat=cellfun("onehot",C,D,"UniformOutput",false);
output=cell2mat(onehotmat);
这会将整个y列设置为1。我想避免编写循环,这是最明显的解决方案:-)问题在Amro编辑之前不是很清楚:),一定要接受其他人的回答他的问题实际上是最好的解决方法,并且你提出了一个for循环XD。这就是我要寻找的,换位或换位:-)谢谢@弗兰克:我还认为统计工具箱有一个类似的功能,即bsxfun v是否有相对的优点/缺点。sub2ind?@Frank:这是基于索引的,我的需要进行相等比较。。。看看他们在性能方面的比较会很有趣。我检查了性能。sub2ind解决方案比bsxfun解决方案略快。对我来说,可能的复制品是eye(K)(V,:),它与您的类似,但将第2行和第3行压缩为一行。但更有用的是,K是可能的类的数量,而不是实际存在的类,因此,例如,如果有10个可能的结果,其中4个实际存在,它将工作得更正确、更可靠。
function vector = onehot(vector,decimal)
vector(decimal)=1;
end
aa=zeros(10,2);
dec=[5,6];
%split into columns
C=num2cell(aa,1);
D=num2cell(dec,1);
onehotmat=cellfun("onehot",C,D,"UniformOutput",false);
output=cell2mat(onehotmat);