2017-11-16 1 views
0

의 모든 가능한 0과 1 행렬은 더 나은 내가 필요한 것을 설명하기 위해, 여기 내 첫 번째 코드 :정상적인 그래프

function allpos = f1(x) 
allpos=reshape(permute((dec2base(0:power(2,x*x)-1,2)-'0'),[3 2 1]),x,x,[]); 

이 코드는 내가 그것을 필요 정확히 않습니다. 사용자 입력 f1(2) 경우 [0 0; 0 0]에서 [1 1; 1 1]에 대한 모든 행렬을 반환합니다. 그러나, 그것은 또한 쓸모없는 많은 매트릭스를 제공합니다. 난 단지 대각선에 0이 붙어있는 대각선을 가로 질러 대칭되는 행렬을 원합니다.

간단히 말하면 f1(3)의 경우에만 [0 0 0; 0 0 0; 0 0 0]부터 [0 1 1; 1 0 1; 1 1 0]까지만 입력하면됩니다. 즉, 내가 새로운 것을 실행한다면, f1(3); 512가 아닌 8 개의 행렬을 반환합니다.

어떻게 함수를 다시 작성합니까? 나는 그것이 삼각 행렬과 그 전치 된 자기의 어떤 종류의 추가를 필요로한다는 것을 안다. 그러나 나는 그것을 함께 조각하지 않는다. 감사!

답변

0

아마도 더 간결하게 만들 수 있지만 다음 내용은 귀하가 요청한 내용입니다. @ jodag의 하나

function allpos = f1(x) 
N = (x-1)*x/2; 
z = permute(dec2base(0:power(2,N)-1,2)-'0',[3 2 1]); 
allpos = zeros(x,x,power(2,N)); 
idx = repmat(logical(tril(ones(x),-1)),[1,1,power(2,N)]); 
allpos(idx) = z(:); 
allpos = permute(allpos,[2 1 3]); 
allpos(idx) = z(:); 
+0

딱! 고맙습니다. – CharlesLyleLarue

0

유사한 솔루션 하지만, 더 간결 ...

function allops=f1(x) 
allops=zeros(x,x,2^(sum(1:x-1))); 
allops(find(triu(ones(x),1))+x^2*(0:2^(sum(1:x-1))-1))=[dec2base(0:2^(sum(1:x-1))-1,2)-'0'].'; 
allops=allops+permute(allops,[2 1 3]) 
end 
+0

이 코드에 대한 유일한 문제는 반사가 제대로 최종 매트릭스에 채워지지 않는다는 것입니다. 예를 들어 : [0 0 1; 1 0 1; 1 0 0]보다 [0 1 0]; 0 0 1; 1 1 0]. 고맙습니다! – CharlesLyleLarue

+0

좋습니다. 대칭을 정의하는 방법에 따라 다릅니다. 지금 내 편집보기 – Adiel