【问题标题】:Efficiently unpack a vector into binary matrix Octave有效地将向量解包成二进制矩阵 Octave
【发布时间】:2015-05-28 06:31:40
【问题描述】:

在 Octave 上,我正在尝试以以下格式解压缩矢量:

y = [ 1  
      2  
      4  
      1 
      3 ]

我想返回一个维度矩阵( rows(y) x max value(y) ),其中对于每一行,我在原始数字值的列中都有一个 1,而在其他任何地方都是一个零,即对于上面的例子

y01 = [ 1 0 0 0
        0 1 0 0
        0 0 0 1
        1 0 0 0
        0 0 1 0 ]

目前为止

y01 = zeros( m, num_labels );
for i = 1:m
    for j = 1:num_labels
        y01(i,j) = (y(i) == j);
    end
end

这可行,但对于更大的矩阵来说会变慢,而且似乎效率低下,因为它会循环遍历每个值,即使大多数值没有变化。

我在another thread 上为 R 找到了这个:

f3 <- function(vec) {
    U <- sort(unique(vec))
    M <- matrix(0, nrow = length(vec), 
          ncol = length(U), 
          dimnames = list(NULL, U))
    M[cbind(seq_len(length(vec)), match(vec, U))] <- 1L
    M
}

但我不知道 R,我不确定解决方案是否/如何移植到八度。

感谢您的任何建议!

【问题讨论】:

    标签: matrix vector binary octave


    【解决方案1】:

    使用可以像往常一样用于进一步计算的稀疏矩阵(这也节省了大量内存):

    y = [1; 2; 4; 1; 3]
    y01 = sparse (1:rows (y), y, 1)
    

    如果你真的想要一个完整的矩阵,那么使用“full”:

    full (y01)
    ans =
    1   0   0   0
    0   1   0   0
    0   0   0   1
    1   0   0   0
    0   0   1   0
    

    【讨论】:

      【解决方案2】:

      当矩阵很大时,稀疏是一种更有效的方法。 如果你的结果维度不是很高,你可以试试这个:

      y = [1; 2; 4; 1; 3]
      I = eye(max(y));
      y01 = I(y,:)
      

      结果与 full(sparse(...)) 相同。

      y01 =
      
         1   0   0   0
         0   1   0   0
         0   0   0   1
         1   0   0   0
         0   0   1   0
      

      【讨论】:

        【解决方案3】:
        % Vector y to Matrix Y
        Y = zeros(m, num_labels);
        
        % Loop through each row
        for i = 1:m
            % Use the value of y as an index; set the value matching index to 1
            Y(i,y(i)) = 1;
        end
        

        【讨论】:

          【解决方案4】:

          另一种可能是:

          y = [1; 2; 4; 1; 3]
          classes = unique(y)(:)
          num_labels = length(classes)
          y01=[1:num_labels] == y 
          

          带有以下详细打印输出:

          y =    
             1
             2
             4
             1
             3
          
          classes =    
             1
             2
             3
             4
          
          num_labels =  4
          y01 =
          
            1  0  0  0
            0  1  0  0
            0  0  0  1
            1  0  0  0
            0  0  1  0
          

          【讨论】:

            猜你喜欢
            • 2019-05-02
            • 1970-01-01
            • 1970-01-01
            • 2014-08-17
            • 2011-09-26
            • 1970-01-01
            • 2011-05-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多