永发信息网

matlab中生成生成一组105x15的向量,各个元素非0即1,各行元素之和是2,每行不能重复。请问该如何实现。

答案:4  悬赏:50  手机版
解决时间 2021-03-26 09:28
  • 提问者网友:喧嚣尘世
  • 2021-03-25 16:16
matlab中生成生成一组105x15的向量,各个元素非0即1,各行元素之和是2,每行不能重复。请问该如何实现。
最佳答案
  • 五星知识达人网友:风格不统一
  • 2021-03-25 17:49
i=1;
for a1=0:1
for a2=0:1
for a3=0:1
for a4=0:1
for a5=0:1
for a6=0:1
for a7=0:1
for a8=0:1
for a9=0:1
for a10=0:1
for a11=0:1
for a12=0:1
for a13=0:1
for a14=0:1
for a15=0:1
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15==2
b(i,:)=[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15];
i=i+1;
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
b
全部回答
  • 1楼网友:底特律间谍
  • 2021-03-25 21:10
randperm(17)<=7
  • 2楼网友:往事隔山水
  • 2021-03-25 19:42
randperm(17)<=7
  • 3楼网友:山河有幸埋战骨
  • 2021-03-25 18:54
这个问题的关键是如何出现不重复。如果一下直接产生一个105*15的矩阵要不重复,那概率是非常低的,可以看看本人程序二。有兴趣可以自己算算概率,哈哈。所以这里只能用一行行的产生,没产生一行检测一次跟前面是否重复。
至于产生非0即1这个不难,方法是产生随机数,将最大最小的位置置1,其他地方置0,这样就保证了每行只有两个1,且是随机出现。
较好的程序为程序一。 程序二当行数大时就不好用了。
程序一:
clear;
clc;
low = input('the number of low: ');
line = input('the number of line: ');
C = zeros(low,line);
%%%%%% creat low 1 %%%%%%%%%
A = rand(1,line);
B = zeros(1,line);

[a,b] = max(A);
[c,d] = min(A);
B(b) = 1;
B(d) = 1;

C(1,:) = B;
%disp(B);
%%%%%% creat low 2 to last low %%%%%
for ii = 2:low
tip = 1;
while(tip)
A = rand(1,line);
B = zeros(1,line);

[a,b] = max(A);
[c,d] = min(A);

B(b) = 1;
B(d) = 1;
%%%%%%%% 判断是否会重复 %%%%%%%%
jj = 1;
while jj tsum = sum(C(jj,:)==B);
if tsum == line
tip = 1;
break
end
jj = jj+1;
end
if jj==ii
C(ii,:) = B;
%disp(B)
tip = 0;
end
end
end
myneed = C %%%%% 最终结果存于myneed中
运行结果很长,给出部分:
the number of low: 105
the number of line: 15
myneed =
0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
。。。。。。。。。
程序二:
clear;
clc;
low = input('the number of low: ');
line = input('the number of line: ');
tip = 1;
while(tip)
A = rand(low,line);
B = zeros(low,line);
[a1,b]=max(A');
[a2,c]=min(A');
for ii=1:low
B(ii,b(ii))=1;
B(ii,c(ii))=1;
end
%%%% 以下检查是否出现一样的情况 %%%%%%%
ii=1;
while(ii for jj=(ii+1):low
t_sum = sum(B(ii,:)==B(jj,:));
if t_sum==line
disp('try again!');
tip = 1;
break;
end
end
if jj==low
ii=ii+1;
else
break;
end
end
if ii==low
tip=0;
end
end
myneed = B %%%% 存结果
有问题欢迎追问
copyright)(c) cxd1301追问已经用unique(矩阵,‘rows’)进行验证了,结果和原矩阵行数相同,即没有出现重复的行。
方法绝对可行。当然为了提高准确率,也可以用format long ,将数值精确度提高,这样会
更不易出现重复现象。
准问:若各行元素之和是5或6之类,那该怎么改进呢?
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯