【问题标题】:How to generate a random binary matrix where only one bit in each row has value 1?如何生成一个随机二进制矩阵,其中每行中只有一位的值为 1?
【发布时间】:2017-01-03 20:25:10
【问题描述】:

我想用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

对吗?

【问题讨论】:

  • 正确吗?嗯,你试过运行它吗?
  • 我运行它,它给了我一个随机二进制矩阵,如上条件。我不确定我的代码是否正确
  • 我运行它,它满足每个 row 包含一个值为 1 的位置的条件。
  • 是的。我可能在行和列之间搞错了

标签: matlab matrix random


【解决方案1】:

解决方案有效,但效率低下。
您正在使用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 将“行索引”转换为“矩阵索引”。
  • 将 1 放在“矩阵索引”中。

【讨论】:

    【解决方案2】:

    您可以使用bsxfunrandi 在一行中完成:

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

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

    【讨论】:

      猜你喜欢
      • 2020-08-31
      • 1970-01-01
      • 2015-11-26
      • 2015-03-01
      • 1970-01-01
      • 2019-10-14
      • 2020-07-27
      • 1970-01-01
      • 2022-12-03
      相关资源
      最近更新 更多