在MATLAB中创建索引为1的矩阵的矢量化方法
假设给我一个在MATLAB中创建索引为1的矩阵的矢量化方法,matlab,neural-network,multilabel-classification,Matlab,Neural Network,Multilabel Classification,假设给我一个1000x1列向量,其值范围为1-10。现在我想把它转换成一个1000x10矩阵,其中每一行的列向量中的值都是1。下面我有一个正确的实现,但是有没有一种优雅的方法可以不用for循环来实现呢 ymat = zeros(1000, 10); y = randi([1,10],1000,1); for i=1:1000 ind = y(i); ymat(i,ind)=1; end 当然。使用repmat和bsxfun。例如: bsxfun(@eq,repmat(1:10,
1000x1
列向量,其值范围为1-10。现在我想把它转换成一个1000x10
矩阵,其中每一行的列向量中的值都是1。下面我有一个正确的实现,但是有没有一种优雅的方法可以不用for
循环来实现呢
ymat = zeros(1000, 10);
y = randi([1,10],1000,1);
for i=1:1000
ind = y(i);
ymat(i,ind)=1;
end
当然。使用
repmat
和bsxfun
。例如:
bsxfun(@eq,repmat(1:10,numel(y),1),repmat(y,1,10))
答复:
...
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
>>
当然。使用
repmat
和bsxfun
。例如:
bsxfun(@eq,repmat(1:10,numel(y),1),repmat(y,1,10))
答复:
...
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
>>
您有一组列索引,相应的行索引应该是
1:1000
有两个选项可以从中生成矩阵
% Full matrix using accumarray
ymat = accumarray([(1:1000).', y], ones(1000,1), [1000, 10]);
% Sparse matrix using sparse
ymat = sparse(1:1000, y, ones(1000,1), 1000, 10, 1000);
计算时间
我用y=1000x1
和y=10000x1
运行代码
accumarray
速度最快,sparse
速度最慢
accumarray
对于小尺寸显示出更好的性能,但是随着阵列大小的增加,accumarray
和bsxfun(@eq)
之间的差距越来越小。您有一组列索引,相应的行索引应该是1:1000
有两个选项可以从中生成矩阵
% Full matrix using accumarray
ymat = accumarray([(1:1000).', y], ones(1000,1), [1000, 10]);
% Sparse matrix using sparse
ymat = sparse(1:1000, y, ones(1000,1), 1000, 10, 1000);
计算时间
我用y=1000x1
和y=10000x1
运行代码
accumarray
速度最快,sparse
速度最慢
accumarray
对于小尺寸显示了更好的性能,但是随着数组大小的增加,accumarray
和bsxfun(@eq)
之间的差距越来越小。我们可以使用这些条目中的“”一次访问ymat中的任何条目子集。因为我们已经有了包含列坐标的y,而行坐标仅为1:100,所以我们可以通过sub2ind
轻松获得它们的线性索引值,然后在ymat
中将所有索引值设置为1:
ymat(sub2ind([1000 10], (1:1000)', y)) = 1
但是请注意,必须事先创建具有适当大小的
ymat
。我们可以使用这些条目中的“”一次访问ymat中所有条目的任何子集。因为我们已经有了包含列坐标的y,而行坐标仅为1:100,所以我们可以通过sub2ind
轻松获得它们的线性索引值,然后在ymat
中将所有索引值设置为1:
ymat(sub2ind([1000 10], (1:1000)', y)) = 1
但是请注意,必须事先创建具有适当大小的ymat
。您也可以使用以下功能:
ymat=full(ind2vec(y.').')
您还可以使用以下功能:
ymat=full(ind2vec(y.').')
上面的副本回答了您的问题。只需将结果转置以获得所需的结果,或者在不转置的情况下反转答案中的行和列索引。以上重复的结果回答了您的问题。只需转置结果即可获得所需的结果,或者在不转置的情况下反转答案中的行和列索引。
sparse
的一个可能优化是,您不需要使用one
向量将所有非零项声明为1。sparse
的一种特殊情况是,如果矩阵中的每个非零值都等于相同的值,则只需指定一个常量来反映所有这些值。因此,只要做ymat=sparse(1:1000,y,1,…)
使用sparse
的一个可能优化是,您不需要使用ones
向量将所有非零项声明为1。sparse
的一种特殊情况是,如果矩阵中的每个非零值都等于相同的值,则只需指定一个常量来反映所有这些值。因此,只要做ymat=sparse(1:1000,y,1,…)代码>