如何创建随机矩阵,其中每列都是零,除了一个随机行?

时间:2015-10-07 22:59:26

标签: matlab matrix vectorization

我想创建一个大小为m的矩阵 - by - n,其中列中的所有元素都是0,除了一个元素是1.一个元素必须处于随机位置。< / p>

例如。

[0 1 0 0 0
 0 0 1 0 0
 1 0 0 1 0
 0 0 0 0 0 
 0 0 0 0 1]

5 个答案:

答案 0 :(得分:4)

为了增加一些变化,这是另一种方法:

m = 4;
n = 5;
[~, result] = sort(rand(m,n));
result = double(result==1);

例如,这提供了

result =
     0     0     0     0     1
     0     1     0     0     0
     1     0     0     1     0
     0     0     1     0     0

答案 1 :(得分:4)

您还可以使用randmax来完成这项工作:

m=4;
n=5;
R=rand(m,n);
result = bsxfun(@eq, R, max(R,[],1))

在我的机器上它给出了:

 1     1     0     0     0
 0     0     0     0     0
 0     0     1     0     1
 0     0     0     1     0

工作原理:生成随机矩阵R,然后将与每列最大元素对应的条目设置为1。无需sort

关于Divakar原始答案,由于它使用randperm,因此仅限于方阵,并且只会产生随机permutation matrices。<登记/> 纠正其解决方案的一种可能方法是使用randi代替randperm

result = bsxfun( @eq, (1:m)', randi(m, 1, n ) )

可以提供此输出:

 1     0     1     0     0
 0     0     0     0     0
 0     0     0     0     0
 0     1     0     1     1

至于bla的答案,使用accumarry可以节省zerossub2ind的使用:

m=5; n=10;
R=randi(m,n,1);
A = accumarray( {R, (1:n)' }, 1, [m n] )

可以提供此输出:

 0     0     0     0     1     0     0     1     0     0
 0     1     0     0     0     0     1     0     1     0
 1     0     0     1     0     0     0     0     0     1
 0     0     0     0     0     1     0     0     0     0
 0     0     1     0     0     0     0     0     0     0

答案 2 :(得分:3)

这是使用randi的示例:

m=5; n=10;
A=zeros(m,n);
R=randi(m,n,1);
A(sub2ind(size(A),R',1:n))=1


A =

 0     0     0     0     0     0     0     1     0     1
 0     0     1     0     0     0     0     0     0     0
 0     1     0     1     0     1     0     0     0     0
 0     0     0     0     1     0     0     0     0     0
 1     0     0     0     0     0     1     0     1     0

答案 3 :(得分:3)

您可以将sparserandi一起用于单行,如此 -

full(sparse(randi(m,1,n),1:n,1,m,n))

示例运行 -

>> m = 5; n = 6;
>> full(sparse(randi(m,1,n),1:n,1,m,n))
ans =
     0     1     0     0     0     1
     0     0     1     1     0     0
     0     0     0     0     0     0
     1     0     0     0     1     0
     0     0     0     0     0     0

答案 4 :(得分:3)

我的另一个想法是创建大小为m x m的单位矩阵,然后使用范围从1到randi的{​​{1}}来创建m的向量元素很长。之后,您将使用此向量访问单位矩阵的列以完成您想要的随机矩阵:

n

这是上面代码的一个可能的运行:

m = 5; n = 5; %// Given your example
M = eye(m);
out = M(:,randi(m, n, 1));