3

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

例如,类似:

>> mostlyzeros(6, 3)

ans =

     0     0     1     0     0     0

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

4

6 回答 6

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 ,则需要使用零而不是仅仅将第 N 个值分配为零 - 根据我的经验,创建之前不存在的零向量或矩阵是最容易通过将它的最后一个元素分配为零来完成 - 它对于扩展矩阵或向量也很有用)。

于 2013-03-17T23:39:49.857 回答
2

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

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

但我很高兴被证明是错误的!

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

下一个更新:啊!这就是你所说的“选择向量”。@GlenO 很好地解释了为什么对于这个操作,一个和零的向量不是惯用的 Matlab - 但是你选择构建它。

ps 尽量避免i用作下标,因为它实际上是一个matlab函数

于 2013-03-17T23:08:39.517 回答
2

只是为了它的乐趣,另一个单线:

function [out] = mostlyzeros(idx, L)
out([L, idx]) = [0 1];
于 2013-03-18T08:11:02.047 回答
1

我能想到:

function mostlyones(m,n)

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

另外,要注意一件事。在 MATLAB 中,索引从 1 开始,而不是从 0 开始。所以你的函数调用应该是mostlyzeros(6,3)

于 2013-03-17T23:08:49.447 回答
1

我会简单地创建一个零向量并将您喜欢的任何值更改为一个:

function zeroWithOne(int numOfZeros, int pos)
a = zeros(numOfZeros,1);
a(pos) = 1;
于 2013-03-17T23:09:59.703 回答
1

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

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

于 2013-03-18T13:30:29.637 回答