【问题标题】:Matlab/Octave one-liner for a n-vector with a 1 in the i-th positionMatlab/Octave one-liner,用于第 i 个位置为 1 的 n 向量
【发布时间】:2012-06-04 03:47:39
【问题描述】:

例如,给定i=5n=8,我想生成[0;0;0;0;1;0;0;0]。具体来说,我想生成向量v 以便:

v = zeros(n,1);
v(i) = 1;

有没有一种(合理的)方法可以在一行中做到这一点?

【问题讨论】:

标签: matlab octave


【解决方案1】:

另一种解决方案:

I = eye(n);

v = I(:, i);

实际上,您可以拥有一个从 1 到 n 的数字向量y,并为每个元素获取这样的向量:

v = I(:, y);

您可以查看我的blog post 了解有关此通用解决方案的详细信息。

【讨论】:

    【解决方案2】:

    一种方式是[1:8]'==5,或者更普遍的是[1:n]'==i

    【讨论】:

    • 很好的解决方案。但它并不完全相同,因为你得到的是合乎逻辑的而不是双重的。我会加倍([1:n]'==i);
    • +1 表示答案,+1 表示 Andrey 的评论。双精度是原始问题的确切答案所必需的。
    【解决方案3】:

    这是另一个解决方案,使用sparse 创建一个n 长度行向量,在ith 位置为1:

    v = sparse(1,i,1,1,n)
    

    优点是对于大的n,这也是内存高效的,可以像往常一样用于矩阵计算。如果您需要完整的矢量,只需使用full

    【讨论】:

    • 谢谢!出于内存考虑,我选择了这个答案。
    【解决方案4】:

    这是另一个:

    n = 8;
    p = 4;
    arrayfun(@str2double,dec2bin(2^(p-1),n))
    

    还有一个(创建一个行向量):

    circshift( [1 zeros(1,n-1)],[0 p]);
    

    或列向量:

    circshift( [1 ; zeros(n-1,1)],[p 0]);
    

    这是另一个:

    subsref( eye(n), struct('type','()', 'subs',{{ p,':' }}))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      相关资源
      最近更新 更多