【问题标题】:Convert vector into logical matrix?将向量转换为逻辑矩阵?
【发布时间】:2011-12-24 02:33:55
【问题描述】:

我有一个长度为 n 的向量 y。 y(i) 是 1..m 中的整数。是否有更简单的方法将 y 转换为 n x m 逻辑矩阵 yy,如果 y(i) = j 则 yy(i, j) = 1,否则为 0?以下是我的做法:

% If m is known (m = 3 here), you could write it out all at once
yy = [y == 1; y== 2; y == 3];
yy = reshape(yy, n, 3);

% if m is not known ahead of time
yy = [ y == 1 ];
for i = 2:m;
    yy = [ yy; y == i ];
end
yy = reshape(yy, n, m);

【问题讨论】:

  • 我找到了另一种方法...不确定这是否更好...但至少它适合一行:yy = repmat(y,1,m) == repmat(1: m, n, 1);
  • bsxfun 是多线程 Matlab 函数之一。因此,它可能比您的解决方案更快。

标签: matlab octave


【解决方案1】:

你可以用八度来写:

yy = y' == (1:m); % or y == (1:m)' for transposed
[1 2 1 3 2] == [1 2 3]' % = [1 0 1 0 0; 0 1 0 0 1; 0 0 0 1 0]

【讨论】:

    【解决方案2】:

    来自 Coursera 上的机器学习:

    yy = eye(m)(y, :)
    

    这要求列表是一个范围1:m(如 OP 所述)。对于不规则列表,例如[2 3 5],请执行此操作

    yy = eye(m)(:, [2 3 5])(y, :)
    

    注意:未在 MATLAB 上测试。

    【讨论】:

    • (但我还是更喜欢@Jonas 的方式,非常简洁。)
    【解决方案3】:

    对您的方法稍作修改:

    % A n-dimensional vector y, with values in some range 1..m
    m = 4;
    n = 7;
    y = randi([1 m], n, 1);
    
    % Preallocating a n by m matrix of zeros
    nXm = zeros(n, m);
    
    % In each pass of this loop a single column of nXm is updated, where
    % for each column index j in nXm, if y(i) = j then nXm(i,j) = 1
    for j = 1:m;
        nXm(:,j) = (y == j);
    end
    

    【讨论】:

      【解决方案4】:

      如果 n*m 足够大(并且 m 本身也足够大),最好将 yy 创建为稀疏矩阵。您的y 向量确实是一种特殊类型的稀疏矩阵格式,但我们可以通过执行以下操作将其转换为内置的稀疏矩阵格式。

      yy = sparse(1:length(y), y, 1);
      

      这将使您的存储空间保持在 O(n)。如果您使用yy 进行大量索引,它不会给您带来很多好处。如果是这种情况,您最好使用原始稀疏结构(即y)。

      【讨论】:

        【解决方案5】:

        您可以为此使用bsxfun

        yy = bsxfun(@eq,y(:),[1,2,3])
        

        y 被转换(如果需要)为列向量,而另一个向量是行向量。 bsxfun 隐式扩展 m×1 和 1×n 数组,使结果变为 m×n。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          • 2019-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-10
          相关资源
          最近更新 更多