2014-08-28 99 views
1

如何使用布尔元素生成矩阵,但每行的总和等于某个常数。Matlab使用随机元素生成矩阵

+1

我认为你可以尝试生成随机元素的矩阵。然后按行进行排序并将最大的n个元素设置为true,将其他元素设置为false。这会给每一行总和n。 – patrik 2014-08-28 11:04:45

+0

@RTL类似的问题,但链接的问题没有一个接受的答案,这一个是“更容易”,因为你没有专栏的特定约束。 – 2014-08-28 11:40:08

+0

@Shai我不知道这是否应该标记为重复,因为目前提供的答案非常类似的问题不起作用... – Dan 2014-09-02 06:02:33

回答

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 
+0

你的方法的作品!谢谢 – 2014-08-28 11:23:05

+1

你错过了一个编辑。将该转换置于循环外的布尔值。否则,你每次都这样做。还要检查一下Dan的解决方案,该解决方案没有任何循环(对于大矩阵来说可能更快) – 2014-08-28 11:24:54

6

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

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

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

如果你不希望相同数量的1 s分别排,而是有你想要多少1当时的你需要使用bsxfun以及矢量每行指定:

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

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

伟大的解决方案。这个问题似乎很难矢量化 – 2014-08-28 11:37:30