如何使用布尔元素生成矩阵,但每行的总和等于某个常数。
答案 0 :(得分:6)
每一行都是一个数字吗?
k = 5;
m = 10;
n = 10;
[~, I] = sort(rand(m,n), 2)
M = I <= k
如果您不想在每一行中使用相同数量的1
,而是拥有一个向量指定每行需要多少1
,那么您需要使用{ {1}}:
bsxfun
答案 1 :(得分: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
,然后得到一个数组,其中包含所需数量为0的数组。根据{{1}}重新排序这些元素,并将其保存为逻辑。并且由于使用了for循环rand_order
,所有时间都会再次计算,因此为您的输出提供了不同的位置:
rand_order