9

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

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

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

4

4 回答 4

14

另一种解决方案:

I = eye(n);

v = I(:, i);

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

v = I(:, y);

有关此通用解决方案的详细信息,您可以查看我的博客文章

于 2012-06-05T00:16:02.777 回答
13

一种方法是[1:8]'==5,或更一般地[1:n]'==i

于 2012-06-04T03:49:08.537 回答
5

这是另一种解决方案,sparse用于创建在第 th 位置n具有 1 的长度行向量:i

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

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

于 2012-06-05T00:29:40.323 回答
1

这是另一个:

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,':' }}))
于 2012-06-04T06:14:25.743 回答