Matlab/倍频程1/K表示法

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

我有一个大小为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(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);