有效地将矢量解包为二进制矩阵Octave

时间:2015-05-28 06:31:40

标签: matrix vector binary octave

在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和我不确定解决方案是否/如何移植到八度音程。

感谢您的任何建议!

4 个答案:

答案 0 :(得分:5)

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

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

如果你真的想要一个完整的矩阵,那么使用&#34; full&#34;:

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

答案 1 :(得分:1)

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

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

结果与完全相同(稀疏(...))。

y01 =

   1   0   0   0
   0   1   0   0
   0   0   0   1
   1   0   0   0
   0   0   1   0

答案 2 :(得分:1)

% 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

答案 3 :(得分:0)

另一种可能性是:

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