我想创建一个大小为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]
答案 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)
您还可以使用rand
和max
来完成这项工作:
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
可以节省zeros
和sub2ind
的使用:
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)
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));