在Matlab中,假设我想创建一个长度为L
的0向量,除了索引为i
的1之外?
例如:
>> mostlyzeros(6, 3)
ans =
0 0 1 0 0 0
目的是这样我可以将它用作'选择'向量,我将元素与另一个向量相乘。
答案 0 :(得分:11)
我能想到的最简单的方法是:
a = (1:N)==m;
其中N> = m。话虽如此,如果你想将结果向量用作“选择向量”,我不知道你为什么要将两个向量元素相乘,因为我预计它会相对缓慢而且效率低下。如果你想在第m个位置得到一个只包含向量v的第m个值的向量,这将是一个更简单的方法:
b = ((1:N)==m)*v(m);
虽然最自然的方法必须如此:
b(N)=0;
b(m)=v(m);
假设在此之前未定义b(如果定义了b,则需要使用零而不是仅将Nth值指定为零 - 我的经验是创建一个不存在的零向量或矩阵在此之前最容易通过将其最后一个元素指定为零来完成 - 它对于扩展矩阵或向量也很有用。
答案 1 :(得分:2)
我很难想到比以下更明智的事情:
Vec = zeros(1, L);
Vec(i) = 1;
但我很高兴被证明是错的!
更新: @GlenO提供的单线解决方案非常整洁!但是,请注意,如果效率是主要标准,那么我的机器上的一些速度测试表明这个答案中提出的简单方法和其他两个答案的速度提高了3到4倍......
下一次更新:啊!这就是“选择向量”的含义。 @GlenO已经很好地解释了为什么对于这个操作,一个零和一个零的向量不是惯用的Matlab - 但是你选择构建它。
ps尽量避免使用i
作为下标,因为它实际上是matlab function。
答案 2 :(得分:2)
只是为了它的乐趣,另一个单行:
function [out] = mostlyzeros(idx, L)
out([L, idx]) = [0 1];
答案 3 :(得分:1)
我能想到:
function mostlyones(m,n)
mat=zeros(1,m);
mat(n)=1;
另外,有一点需要注意。在MATLAB中,索引从1开始而不是从零开始。所以你的函数调用应该是mostlyzeros(6,3)
答案 4 :(得分:1)
我只需创建一个零向量并将您喜欢的任何值更改为一个:
function zeroWithOne(int numOfZeros, int pos)
a = zeros(numOfZeros,1);
a(pos) = 1;
答案 5 :(得分:1)
另一个应该很快的行选项是:
vec = sparse(1, ii, 1, 1, L);