数学建模社区-数学中国

标题: 找出满足条件的所有矩阵并且输出 [打印本页]

作者: khafi    时间: 2012-8-7 13:48
标题: 找出满足条件的所有矩阵并且输出
本帖最后由 大笨象 于 2012-8-7 14:34 编辑

有个n×n 矩阵元素只能为0或1  矩阵行列相同时的元素为0   矩阵所有元素和为n*(n-1)/2  求帮助
作者: khafi    时间: 2012-8-7 13:51
本帖最后由 大笨象 于 2012-8-7 14:34 编辑

希望大家讨论
作者: wish_豪    时间: 2012-8-7 14:09
这个简单吧,用个最简单的循环都可以做出来。。
作者: khafi    时间: 2012-8-7 14:14
  求教。。。

作者: 大笨象    时间: 2012-8-7 14:36
把问题再描述的清楚一些。
作者: 大笨象    时间: 2012-8-7 14:36
把问题再描述的清楚一些。
作者: wish_豪    时间: 2012-8-8 10:29
本帖最后由 wish_豪 于 2012-8-8 10:31 编辑

先判断是否为n*n矩阵,再判断元素和是否符合要求,再用diag提取主对角线元素,直接求其和,判断是否为0。最后循环判断每个元素是否为0或1

最后一步暂时不知不用循环能否做出来
作者: wish_豪    时间: 2012-8-8 15:19
随便编写个 你试试
function panduan=duan(w)
%判断n阶矩阵
[a,b]=size(w);
if a~=b
    disp('矩阵不是n阶矩阵');
    panduan=0;
    return
else
    panduan=1;
end
%判断元素和
if sum(w)~=a*(a-1)/2
    disp('元素和不符合要求');
    panduan=0;
    return
else
    panduan=1;
end
%判断主对角线元素和是否为0
if sum(diag(w))~=0
    disp('主对角线元素和不为0');
    panduan=0;
    return
else
    panduan=1;
end
for i=1:a
    for j=1:a
        if w(i,j)==0||w(i,j)==1
            panduan=1;
        else
            disp('元素不为0或1');
             panduan=0;
             return
        end
    end
end

作者: khafi    时间: 2012-8-8 16:33
wish_豪 发表于 2012-8-8 15:19
随便编写个 你试试
function panduan=duan(w)
%判断n阶矩阵

   你的回答非常感谢。不过我可能没表达清楚。不是判断是输出所有满足要求的矩阵。 比如如果是4阶矩阵      [0 1 1 1;0 0 1 1;0 0 0 1;0 0 0 0]就是满足要求的我想把满足要求的全部找出来
作者: wish_豪    时间: 2012-8-8 16:55
khafi 发表于 2012-8-8 16:33
你的回答非常感谢。不过我可能没表达清楚。不是判断是输出所有满足要求的矩阵。 比如如果是4阶矩阵    ...

你这个问题估计3,4阶估计没啥问题,阶数一高符合要求的矩阵就会呈几何倍上升的
作者: 梦天涯M    时间: 2012-8-11 00:01
function res=fun(n)
k=1;
%n为构造矩阵阶数;
N=n*(n-1)/2; %判断有多少个1;
index0=1:n^2;
for i=1:n^2
    if i~=11+n)n^2)
    index(k)=index0(i);
    k=k+1;
    end
end  %保证主对角线为0
kind=nchoosek(index,N);
res=zeros(n,n,kind);
for i=1:size(kind,1)
    s0=zeros(n);
      for j=1:N
          s0(kind(i,j))=1;
          res(:,:,i)=s0;
      end
end
res %矩阵保存变量
作者: 梦天涯M    时间: 2012-8-11 00:01
function res=fun(n)
k=1;
%n为构造矩阵阶数;
N=n*(n-1)/2; %判断有多少个1;
index0=1:n^2;
for i=1:n^2
    if i~=11+n)n^2)
    index(k)=index0(i);
    k=k+1;
    end
end  %保证主对角线为0
kind=nchoosek(index,N);
res=zeros(n,n,kind);
for i=1:size(kind,1)
    s0=zeros(n);
      for j=1:N
          s0(kind(i,j))=1;
          res(:,:,i)=s0;
      end
end
res %矩阵保存变量
作者: 梦天涯M    时间: 2012-8-11 00:02
function res=fun(n)
k=1;
%n为构造矩阵阶数;
N=n*(n-1)/2; %判断有多少个1;
index0=1:n^2;
for i=1:n^2
    if i~=11+n)n^2)
    index(k)=index0(i);
    k=k+1;
    end
end  %保证主对角线为0
kind=nchoosek(index,N);
res=zeros(n,n,kind);
for i=1:size(kind,1)
    s0=zeros(n);
      for j=1:N
          s0(kind(i,j))=1;
          res(:,:,i)=s0;
      end
end
res %矩阵保存变量
作者: 沉醉北风    时间: 2012-8-11 20:03

作者: 梦天涯M    时间: 2012-8-12 11:26
怎么我上次回答的没有显示?那是正确的啊
作者: 梦天涯M    时间: 2012-8-12 11:28
function res=fun(n)
k=1;
%n为构造矩阵阶数;
N=n*(n-1)/2; %判断有多少个1;
index0=1:n^2;
for i=1:n^2
    if i~=11+n)n^2)
    index(k)=index0(i);
    k=k+1;
    end
end  %保证主对角线为0
kind=nchoosek(index,N);
res=zeros(n,n,kind);
for i=1:size(kind,1)
    s0=zeros(n);
      for j=1:N
          s0(kind(i,j))=1;
          res(:,:,i)=s0;
      end
end
作者: 梦天涯M    时间: 2012-8-12 11:29
哭脸是一个冒号和一个左括号,额,他还自己变哭脸了




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5