查看: 1311|回复: 16|关注: 0

[已解决] 请问如何生成一个随机的0-1对称矩阵,要求主对角线为0,且每行1的个数相同

[复制链接]

新手

27 麦片

财富积分


050


2

主题

7

帖子

0

最佳答案
RT

例如,已知每行1的个数是2,如何随机生成一个5*5的0-1对称矩阵,并且使对角线元素都为0?

入门

68 麦片

财富积分


50500


0

主题

52

帖子

4

最佳答案
发表于 2019-8-6 19:12:54 | 显示全部楼层
hao nan hao nan

MATLAB 基础讨论
版块优秀回答者

中级

968 麦片

财富积分


5001500


0

主题

1545

帖子

211

最佳答案
  • 关注者: 37
发表于 2019-8-6 20:58:01 | 显示全部楼层
a=zeros(5);
for ii=1:5
     ind=randperm(5,2);
     while max(ismember(ii,ind))
         ind=randperm(5,2);
     end
     a(ii,ind)=1;
end
虽然写的没什么技术含量,但是凑合着用吧

MATLAB 基础讨论
版块优秀回答者

中级

968 麦片

财富积分


5001500


0

主题

1545

帖子

211

最佳答案
  • 关注者: 37
发表于 2019-8-6 21:00:04 | 显示全部楼层
WarnerChang 发表于 2019-8-6 20:58
a=zeros(5);
for ii=1:5
     ind=randperm(5,2);

还要求是对称矩阵呀,上面的代码不好使了

MATLAB 基础讨论
版块优秀回答者

中级

968 麦片

财富积分


5001500


0

主题

1545

帖子

211

最佳答案
  • 关注者: 37
发表于 2019-8-6 21:00:00 | 显示全部楼层
WarnerChang 发表于 2019-8-6 20:58
a=zeros(5);
for ii=1:5
     ind=randperm(5,2);

还要求是对称矩阵呀,上面的代码不好使了

MATLAB 基础讨论
版块优秀回答者

中级

968 麦片

财富积分


5001500


0

主题

1545

帖子

211

最佳答案
  • 关注者: 37
发表于 2019-8-6 21:04:56 | 显示全部楼层
a=zeros(5);
for ii=1:5
     ind=randperm(5,1);
     while ismember(ii,ind)
         ind=randperm(5,1);
     end
     a(ii,ind)=1;
end

b=a';
c=a+b;
还是有BUG,比较复杂

新手

27 麦片

财富积分


050


2

主题

7

帖子

0

最佳答案
 楼主| 发表于 2019-8-6 21:16:14 来自手机 | 显示全部楼层
求各位大神赐教

新手

14 麦片

财富积分


050


11

主题

30

帖子

1

最佳答案
发表于 2019-8-6 22:03:00 | 显示全部楼层
这个可以,就是太长了,matlab没有swap函数有点麻烦。

clear all;
clc;

a=[0 0 1 1];
for i=1:5
x=randperm(4);
b(i,:)=a(x);
end
b(:,5)=0;

for i=1:5
[b(i,i),b(i,5)] = feval('swap',b(i,i),b(i,5));
end

function [y1,y2] = swap(x1, x2)
y1 = x2;
y2 = x1;
end

论坛优秀回答者

权威

3882 麦片

财富积分



3

主题

4109

帖子

864

最佳答案
  • 关注者: 182
发表于 2019-8-6 22:26:42 | 显示全部楼层
本帖最后由 maple1314168 于 2019-8-6 23:27 编辑
  1. n=5;A=zeros(n);
  2. while any(sum(A,1)~=2)|any(A(:)>=2)|any(diag(A)~=0)
  3. A=zeros(n);
  4. ind1=randperm(n);A(1,ind1(1:2))=1;A(ind1(1:2),1)=1;
  5. for i=2:n-1
  6. ind1=randperm(n+1-i)+1;t=sum(A(i,:));
  7. if t<=1&all(sum(A,1)<=2)
  8. A(i,ind1(1:2-t))=1;A(ind1(1:2-t),i)=1;
  9. else
  10. break
  11. end
  12. end
  13. A(end)=2-sum(A(n,:));
  14. end
复制代码

n,可以更大,不过速度比较慢了。这个搜索不算很好。
代码可能比较长。
每次不一样。其中的一个
A =
     0     0     0     1     1
     0     0     1     0     1
     0     1     0     1     0
     1     0     1     0     0
     1     1     0     0     0

入门

68 麦片

财富积分


50500


0

主题

52

帖子

4

最佳答案
发表于 2019-8-7 17:19:37 | 显示全部楼层
本帖最后由 breezy_gkpm4 于 2019-8-7 18:45 编辑
maple1314168 发表于 2019-8-6 22:26
n,可以更大,不过速度比较慢了。这个搜索不算很好。
代码可能比较长。
每次不一样。其中的一个
可以试一下我这个,n = 200不到一秒就可以出来,还可以再优化
  1. n = 200;
  2. A = zeros(n,'double');
  3. while any(sum(A,2) ~= 2)
  4.     numlist = 1:n;
  5.     A = zeros(n,'double');
  6.     i = 1;
  7.     saverandnum = zeros(1,n,'double');
  8.     randnum = randperm(n-i) + i;
  9.     t = 2;
  10. while i <= n-1
  11.     if saverandnum(i) == 2
  12.         i = i+1;
  13.         continue;
  14.     elseif saverandnum(i) == 1,
  15.         t = 1;
  16.     else
  17.         t = 2;
  18.     end
  19.    logical_matrix = saverandnum == 2;
  20.    len_logical_matrix = sum(~logical_matrix);
  21.    randnum = numlist(~logical_matrix);
  22.    randnum = randnum(randperm(len_logical_matrix));
  23.    if len_logical_matrix == 1 && t == 2
  24.        t = 1;
  25.    end
  26.     pos = randnum(1,1:t);
  27.     A(pos,i) = 1;
  28.     saverandnum(1,pos) = saverandnum(1,pos) + 1;
  29.     saverandnum(1,i) = 2;
  30.     i = i+1;
  31. end
  32. A = A+A';
  33. end
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表