Which MATLAB function can remove the diagonal elements of a NxN matrix

조회 수: 17 (최근 30일)
Jinlong Wei
Jinlong Wei 2011년 2월 1일
편집: oren Tadmor 2014년 6월 12일
Do you know which MATLAB function can do the following work: to remove the diagonal elements of a (N+1)x(N+1) matrix to generate a new NxN matrix.
For say, the old matrix is
[ 0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0 ]
the generated new matrix is
[ 1 2 3
1 2 3
1 2 3 ]
  댓글 수: 1
Kenneth Eaton
Kenneth Eaton 2011년 2월 1일
It's not clear what you are asking. In your example, removing the main diagonal still leaves you with (N+1)*N elements, too many to make an N-by-N matrix. You would have to remove the main diagonal plus either the first superdiagonal or the first subdiagonal to end up with N*N elements.

댓글을 달려면 로그인하십시오.

채택된 답변

Matt Fig
Matt Fig 2011년 2월 1일
Your example doesn't add up, as Kenneth mentioned. However, in general you could do something like this:
A = [ 0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0 ];
A(logical(eye(size(A)))) = []; % Or A = A(~eye(size(A)))
A = reshape(A,4,3); % Or 3,4 or whatever.
  댓글 수: 2
Paulo Silva
Paulo Silva 2011년 2월 1일
A(A==0)=[]
A = reshape(A,4,3);
James Tursa
James Tursa 2013년 1월 30일
편집: James Tursa 2013년 1월 30일
Another variation using linear indexing:
m = size(A,1)+1;
A(1:m:end) = [];
A = reshape(A,4,3); % or whatever

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

Paulo Silva
Paulo Silva 2011년 2월 1일
b=triu(a)
b=b(:,2:end)
c=tril(a)
c=c(:,1:end-1)
b+c
  댓글 수: 1
ahahahaaron
ahahahaaron 2013년 1월 30일
this one produces an overlap and doesn't really produce what the other guy wants.

댓글을 달려면 로그인하십시오.


oren Tadmor
oren Tadmor 2014년 6월 12일
편집: oren Tadmor 2014년 6월 12일
remove_diagonal = @(t)reshape(t(~diag(ones(1,size(t, 1)))), size(t)-[1 0]);
So :
>> m = magic(5)
m =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
ans =
23 24 1 8 15
4 6 7 14 16
10 12 19 20 22
11 18 25 2 3

Youssef  Khmou
Youssef Khmou 2013년 1월 31일
편집: Youssef Khmou 2013년 1월 31일
hi, Jinlong Wei
According to your example : Here is a function :
function Z=diagrem(X)
N=size(X);
Z=X;
if N(1)~=N(2)
error('Matrix is not square');
end
for x=1:N(1)
Z(x,x)=0;
end
for y=1:N(1)-1
Z(y,y+1)=0;
end
Z(Z==0)=[];
Z=reshape(Z,N(1)-1,N(2)-1);
It produces exactly your example ,it removes R(i,i) and in the second loop it removes R(j,j+1) with 1<=i<=n , 1<=j<n .
  댓글 수: 1
Youssef  Khmou
Youssef Khmou 2013년 1월 31일
In case your matrix already contains zeros, then change the code by giving Z(x,x) and Z(y,y+1) a NaN value per example or something else then remove them.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Operating on Diagonal Matrices에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by