在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

有两个选项可以从中生成矩阵

  • Accumaray

  • 稀疏的

  • acccumarray将生成full矩阵,sparse将生成sparse矩阵

    在您的例子中,生成的矩阵的密度为10%,可以将其视为稀疏矩阵

    % 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
    运行代码

  • y=1000 x 1
  • y=10000 x 1
  • 我添加了@transversality condition建议的代码

    结果表明,
    accumarray
    速度最快,
    sparse
    速度最慢


    accumarray
    对于小尺寸显示出更好的性能,但是随着阵列大小的增加,
    accumarray
    bsxfun(@eq)
    之间的差距越来越小。

    您有一组列索引,相应的行索引应该是
    1:1000

    有两个选项可以从中生成矩阵

  • Accumaray

  • 稀疏的

  • acccumarray将生成full矩阵,sparse将生成sparse矩阵

    在您的例子中,生成的矩阵的密度为10%,可以将其视为稀疏矩阵

    % 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
    运行代码

  • y=1000 x 1
  • y=10000 x 1
  • 我添加了@transversality condition建议的代码

    结果表明,
    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,…)