代码之家  ›  专栏  ›  技术社区  ›  Cam

创建索引i为1的向量最常用的方法是什么?

  •  3
  • Cam  · 技术社区  · 12 年前

    在Matlab中,假设我想创建一个长度为0的向量 L ,索引处的1除外 i ?

    例如,类似以下内容:

    >> mostlyzeros(6, 3)
    
    ans =
    
         0     0     1     0     0     0
    

    目的是让我可以把它用作“选择”向量,我将把它与另一个向量按元素相乘。

    6 回复  |  直到 12 年前
        1
  •  11
  •   Glen O    12 年前

    我能想到的最简单的方法是:

    a = (1:N)==m;
    

    其中N>=m。话虽如此,如果你想使用结果向量作为“选择向量”,我不知道为什么你要按元素乘以两个向量,因为我预计这会相对缓慢和低效。如果你想得到一个只包含向量v在第m个位置的第m个值的向量,这将是一个更简单的方法:

    b = ((1:N)==m)*v(m);
    

    尽管最自然的方法是:

    b(N)=0;
    b(m)=v(m);
    

    假设b在此之前没有定义(如果b被定义,你需要使用零,而不仅仅是将第N个值赋值为零-根据我的经验,创建一个在此之前不存在的零向量或矩阵最容易通过将其最后一个元素赋值为零来完成-这对扩展矩阵或向量也很有用)。

        2
  •  2
  •   Colin T Bowers    12 年前

    我很难想出比以下更明智的事情:

    Vec = zeros(1, L);
    Vec(i) = 1;
    

    但我很乐意被证明是错的!

    更新: @GlenO提供的一条龙解决方案非常简洁!然而,请注意,如果效率是主要标准,那么在我的机器上进行的一些速度测试表明,这个答案和其他两个答案中提出的简单方法要快3或4倍。。。

    下一次更新: 啊!这就是你所说的“选择向量”的意思@GlenO已经很好地解释了为什么对于这种操作,一和零的向量不是惯用的Matlab——无论你选择如何构建它。

    ps尽量避免使用 i 作为下标,因为它实际上是 matlab function .

        3
  •  2
  •   H.Muster    12 年前

    只是为了好玩,另一句俏皮话:

    function [out] = mostlyzeros(idx, L)
    out([L, idx]) = [0 1];
    
        4
  •  1
  •   Autonomous    12 年前

    我可以想到:

    function mostlyones(m,n)
    
    mat=zeros(1,m);
    mat(n)=1;
    

    还有一点需要注意。在MATLAB中,索引从一开始,而不是从零开始。所以你的函数调用应该是 mostlyzeros(6,3)

        5
  •  1
  •   Cam    12 年前

    我只需创建一个零向量,然后将您喜欢的任何值更改为一:

    function zeroWithOne(int numOfZeros, int pos)
    a = zeros(numOfZeros,1);
    a(pos) = 1;
    
        6
  •  1
  •   Yanai Ankri    12 年前

    另一个应该很快的单行选项是:

    vec = sparse(1, ii, 1, 1, L);