matlab 0-1 矩阵 16乘以332 每行仅有83个1,每列有且仅有4个1 会的快来,谢谢了!

来源:百度知道 编辑:UC知道 时间:2024/06/25 20:14:32
matlab
随机生成16×332的零一矩阵
每行有且仅有83个1,每列有且仅有4个1
先谢谢了。
我只会保证行或列满足,同时满足实现不来

搞定了的话我再追加

二楼的方法输出的矩阵中有 在每列上的组合只有四种,能否使之不重复(最多重复两个,别三个都一样)
现在追加20

这个问题的思路是先构造一个基本的(4*4)*(4*83)的矩阵并使其满足行列加和要求,这样的矩阵最简单的就是诸如下面的矩阵
A 0 0 0
0 A 0 0
0 0 A 0
0 0 0 A
其中每个A为4*83的全1矩阵
可以明显的证明:对这个矩阵任意两行或两列进行交换(或对行/列中相同个数的相等元素做行/列交换),其行列加和值不变。这样随机进行N次交换就可以获得需要的随机矩阵。
以下给出matlab源代码:

lena=4;
lenb=83;
loop=4;
len_A=lena*loop;%矩阵行
len_B=lenb*loop;%矩阵列
datai=ones(lena,lenb);%单个4*83矩阵
data_t=zeros(len_A,len_B);

%构造初始化矩阵
for i=0:loop-1
data_t(lena*i+1:lena*i+lena,lenb*i+1:lenb*i+lenb)=datai;
end

shift_times=1000;%位移循环次数

%位移方法为随机2行和2列进行交换
for i=1:shift_times
m1=ceil(len_A*rand);
m2=ceil(len_A*rand);
n1=ceil(len_B*rand);
n2=ceil(len_B*rand);
temp=data_t(m1,:);
data_t(m1,:)=data_t(m2,:);
data_t(m2,:)=temp;

temp=data_t(:,n1);
data_t(:,n1)=data_t(:,n2);
data_t(:,n2)=temp;
end
%-----------------------------