如何生成随机二进制矩阵,其中每行中只有一位的值为1?

时间:2016-08-27 07:23:06

标签: matlab matrix random

我想用MATLAB生成满足条件的随机二进制矩阵A(n x m):

每行包含一个值为1的位置。其他职位是价值0。具有1值的位置是随机位置。

我试过这段代码

   n=5;m=10; 
   %% A = randi([0 1], n,m);
   A=zeros(n,m);
   for i=1:n
       rand_pos=randperm(m);
       pos_one=rand_pos(1); % random possition of 1 value
       A(i,pos_one)=1;
   end

这是对的吗?

2 个答案:

答案 0 :(得分:2)

解决方案有效,但效率低下 您正在使用randperm创建向量(数组),然后仅使用向量的第一个元素 您可以使用randi来创建标量(单个元素):

n=5;m=10; 
A=zeros(n,m);
for i=1:m
    %rand_pos gets a random number in range [1, n].
    rand_pos = randi([1, n]);
    A(rand_pos, i)=1;
end

您还可以使用以下"矢量化"解决方案:

rand_pos_vec = randi([1, n], 1, m);
A(sub2ind([n, m], rand_pos_vec, 1:m)) = 1;

以上解决方案:

  • 创建范围[1,n]中随机值的向量。
  • 使用sub2ind转换"行索引" to"矩阵索引"。
  • 将1放入"矩阵索引"。

答案 1 :(得分:1)

您可以使用bsxfunrandi在一行中执行此操作:

A = double(bsxfun(@eq, 1:m, randi(n, n, 1)));

这会将行向量[1 2 ... m]n1的值1×n随机向量进行比较。通过单独扩展进行元素比较。对于每一行,[1 2 ... m]中的一个值恰好等于随机向量中的值。