查看: 1565|回復: 16|關注: 0
打印 上一主題 下一主題

[已解決] 請問如何生成一個隨機的0-1對稱矩陣,要求主對角線為0,且每行1的個數相同

[復制鏈接]

新手

27 麥片

財富積分


050


2

主題

7

帖子

0

最佳答案
RT

例如,已知每行1的個數是2,如何隨機生成一個5*5的0-1對稱矩陣,并且使對角線元素都為0?

入門

68 麥片

財富積分


50500


0

主題

52

帖子

4

最佳答案
2#
發表于 2019-8-6 19:12:54 | 只看該作者
hao nan hao nan

MATLAB 基礎討論
版塊優秀回答者

中級

1056 麥片

財富積分


5001500


0

主題

1610

帖子

231

最佳答案
  • 關注者: 40
3#
發表于 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 基礎討論
版塊優秀回答者

中級

1056 麥片

財富積分


5001500


0

主題

1610

帖子

231

最佳答案
  • 關注者: 40
4#
發表于 2019-8-6 21:00:04 | 只看該作者
WarnerChang 發表于 2019-8-6 20:58
a=zeros(5);
for ii=1:5
     ind=randperm(5,2);

還要求是對稱矩陣呀,上面的代碼不好使了

MATLAB 基礎討論
版塊優秀回答者

中級

1056 麥片

財富積分


5001500


0

主題

1610

帖子

231

最佳答案
  • 關注者: 40
5#
發表于 2019-8-6 21:00:00 | 只看該作者
WarnerChang 發表于 2019-8-6 20:58
a=zeros(5);
for ii=1:5
     ind=randperm(5,2);

還要求是對稱矩陣呀,上面的代碼不好使了

MATLAB 基礎討論
版塊優秀回答者

中級

1056 麥片

財富積分


5001500


0

主題

1610

帖子

231

最佳答案
  • 關注者: 40
6#
發表于 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

最佳答案
7#
 樓主| 發表于 2019-8-6 21:16:14 來自手機 | 只看該作者
求各位大神賜教

新手

14 麥片

財富積分


050


11

主題

30

帖子

1

最佳答案
8#
發表于 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

論壇優秀回答者

權威

3901 麥片

財富積分



3

主題

4120

帖子

868

最佳答案
  • 關注者: 184
9#
發表于 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

最佳答案
10#
發表于 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 下一條

快速回復 返回頂部 返回列表
哪一款德州扑克还能玩