【问题标题】:Matlab Generating a Matrix with random elementsMatlab用随机元素生成矩阵
【发布时间】:2014-10-22 05:07:55
【问题描述】:

如何生成带有布尔元素的矩阵,但每行的总和等于某个常数。

【问题讨论】:

  • 我认为您可以尝试生成一个随机元素矩阵。然后进行按行排序并将最大的 n 个元素设置为 true,将其他元素设置为 false。这会给每一行一个总和 n。
  • @RTL 类似问题,但链接的问题没有可接受的答案,而且这个问题“更容易”,因为您没有特定列的限制。
  • @Shai 我不知道这是否应该被标记为重复,因为在这个极其相似的问题上提供的答案目前不起作用......

标签: matlab random matrix


【解决方案1】:

假设您想要有 20 列 (n=20),而您的向量 a 包含每行中您想要的列数:

n=20;
a= [5 6 1 9 4];
X= zeros(numel(a),n);
for k=1:numel(a)
    rand_order=randperm(n);
    row_entries=[ones(1,a(k)),zeros(1,n-a(k))];
    row_entries=row_entries(rand_order);
    X(k,:)=row_entries;
end
X=boolean(X);

我要做的是生成一个随机有序索引数组rand_order,然后得到一个数组,其中包含所需的填充为零的数量。根据rand_order 对这些元素重新排序,保存并将其转换为逻辑。并且由于使用了 for 循环 rand_order 一直在重新计算,因此为您的输出提供不同的位置:

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

【讨论】:

  • 一个您错过的编辑。将转换为布尔值放在循环之外。否则你每次都这样做。另请查看 Dan 的解决方案,该解决方案无需任何循环即可工作(对于大型矩阵来说很可能更快)
【解决方案2】:

每一行都是同一个数字吗?

k = 5;
m = 10;
n = 10;

[~, I] = sort(rand(m,n), 2)    
M = I <= k

如果您不希望每行中有相同数量的1s,而是有一个向量来指定每行需要多少个1s,那么您还需要使用bsxfun

K = (1:10)';                        %//'
m = 10;
n = 10;

[~, I] = sort(rand(m,n), 2)    
M = bsxfun(@ge, K,I)

【讨论】:

  • 很好的解决方案。这个问题似乎很难矢量化
猜你喜欢
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2017-02-17
  • 2020-04-20
  • 2016-06-30
  • 1970-01-01
相关资源
最近更新 更多