【问题标题】:How to convert a vector into a matrix where values on columns are 1 where the column number is the vector element, else 0?如何将向量转换为列值为 1 的矩阵,其中列号是向量元素,否则为 0?
【发布时间】:2016-10-20 10:47:18
【问题描述】:

我不确定如何表达这个问题,但我认为举个例子会有所帮助。假设我有一个向量 y = [3;1;4;1;6]。我想创建矩阵 Y =

[0     0     1     0     0     0;
 1     0     0     0     0     0;
 0     0     0     1     0     0;
 1     0     0     0     0     0;
 0     0     0     0     0     1]

 ↑     ↑     ↑     ↑     ↑     ↑
 1     2     3     4     5     6

其中每一列的元素是一或零,对应于向量中的值。

我发现我可以使用

Y = []; for k = 1:max(y); Y = [Y (y==k)]; end

我可以在没有 for 循环的情况下执行此操作(如果 y 有数千个元素,这种方法是否更有效)?

谢谢!

【问题讨论】:

    标签: matlab matrix vector


    【解决方案1】:

    您的方法效率不高,因为您在循环中增加了Y 的大小,即not a good programming practice。以下是修复代码的方法:

    Ele = numel(y); 
    Y= zeros(Ele, max(y));
    for k = 1:Ele
        Y (k,y(k))= 1;
    end
    

    这是一种没有循环的替代方法:

    Ele = numel(y);          %Finding no. of elements in y
    Y= zeros(Ele, max(y));   % Initiailizing the matrix of the required size with all zeros
    lin_idx = sub2ind(size(Y), 1:Ele, y.'); % Finding linear indexes
    Y(lin_idx)=1             % Storing 1 in those indexes
    

    【讨论】:

    • 谢谢,Sardar_Usama。效果很好!是否有使用“y”的理由? " 而不是第三行的 "y' "。另外,如果最多有 10 列,sub2ind 是否比使用 for 更有效?
    • @Gnubie 因为sub2ind(SIZ,I,J) 中的IJ 的大小应该相同。在速度方面应该是高效的!
    • @Sadar_Usama:我明白你为什么转置 y,但发现 y' 与 y 相同。 (你的答案中的额外点)。有什么区别?
    • @Gnubie !简单的' 不是转置。如果没有复元素,则它是复共轭,与转置相同。在此处阅读文档以供参考:mathworks.com/help/matlab/ref/transpose.html 和此处:mathworks.com/help/matlab/ref/ctranspose.html
    • @Gnubie 在这里使用sub2ind 的想法实际上比bsxfun 更好,特别是如果y 可以有很大的值。
    【解决方案2】:

    你可以使用bsxfun:

    result = double(bsxfun(@eq, y(:), 1:max(y)));
    

    如果您在 Matlab R2016b 或更高版本上运行代码,您可以将语法简化为

    result = double(y(:)==(1:max(y)));
    

    另一种可能更有效的方法是直接使用accumarray 填写值:

    result = accumarray([(1:numel(y)).' y(:)], 1);
    

    【讨论】:

    • 这个解决方案很慢:n^2 次操作,其中 n (n-1) 是检查导致什么都没有,只有 n 导致写入 1。
    • @titus 你是对的。我添加了另一种可能更有效的方法
    【解决方案3】:

    我找到了另一个解决方案:

    E = eye(max(y));
    Y = E(y,:);
    

    【讨论】:

    • 这看起来很整洁,但不如sub2ind 方法快。谨防!如果max(y) >> numel(y),这将成为迄今为止最慢的。但是如果max(y) << numel(y),这几乎和sub2ind一样好。
    【解决方案4】:

    另一种解决方案:

    Y = repmat(1:max(y), size(y)) == repmat(y, 1, max(y))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-30
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      相关资源
      最近更新 更多