我想用matlab 来实现以下的小程序: 随机产生一个布尔矩阵(要保证这个矩阵的每一列至少有一个1) 每次

随机产生一个布尔矩阵(要保证这个矩阵的每一列至少有一个1)每次选择含有1最多的那一行并记录下来,将此行包含1的所有列删去,将此行删除。重复这个过程,直到矩阵为空阵。输出所有选择了的行。
小弟初学matlab,这个程序真的不知道怎么编,有会的大侠指教一下啊!下面是我下的部分代码,不知道怎么写了,参考。。。。
A=rand(10,20)
A=fix(0.5+A)
H=A
while 1
B=sum(H,2)
[m,i]=max(B)
t=i
for j=1:20
if H(t,j)==1
H(:,j)=[]
end
end
H(t,:)=[]
end

你这个程序有问题。
问题在于你没有把握好算法。你犯的错误在于你没有明白每一次循环删除都会使得矩阵的维数发生变化:比如“for j=1:20”,这里你认为矩阵的列一直为20.显然这是错误的。
显然这是个死循环,给出参考程序:
function H = main()
A=rand(10,20);
A=fix(0.5+A);
H=A;
while 1
B=sum(H,2);
[m,i]=max(B);
t=i;
q=0;
for j=1:20
if H(t,j)==1
H(:,j)=zeros(10,1);
end
end
H(t,:)=zeros(1,20);
end

end
%这里我用0矩阵代替空矩阵,很好的解决了问题。用空矩阵是不能解决问题
的。因为就算可以循环到最后,到最后变为一空矩阵,j为0,又“for j=1:w”(其中w可变),j最小为1,这显然是不能取到的。不知道你为什么会弄个这么奇怪的程序来,呵呵。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-15
A=rand(10,20);
A=fix(0.5+A);
H=A;
while 1
B=sum(H,2);
[m,i]=max(B);
t=i;
q=0;
for j=1:20
if H(t,j)==1
H(:,j)=zeros(10,1);
end
end
if H==zeros(10,20);break;end
end