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

9 vues (au cours des 30 derniers jours)
Jinlong Wei
Jinlong Wei le 1 Fév 2011
Modifié(e) : oren Tadmor le 12 Juin 2014
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 commentaire
Kenneth Eaton
Kenneth Eaton le 1 Fév 2011
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.

Connectez-vous pour commenter.

Réponse acceptée

Matt Fig
Matt Fig le 1 Fév 2011
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 commentaires
Paulo Silva
Paulo Silva le 1 Fév 2011
A(A==0)=[]
A = reshape(A,4,3);
James Tursa
James Tursa le 30 Jan 2013
Modifié(e) : James Tursa le 30 Jan 2013
Another variation using linear indexing:
m = size(A,1)+1;
A(1:m:end) = [];
A = reshape(A,4,3); % or whatever

Connectez-vous pour commenter.

Plus de réponses (3)

Paulo Silva
Paulo Silva le 1 Fév 2011
b=triu(a)
b=b(:,2:end)
c=tril(a)
c=c(:,1:end-1)
b+c
  1 commentaire
ahahahaaron
ahahahaaron le 30 Jan 2013
this one produces an overlap and doesn't really produce what the other guy wants.

Connectez-vous pour commenter.


oren Tadmor
oren Tadmor le 12 Juin 2014
Modifié(e) : oren Tadmor le 12 Juin 2014
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 le 31 Jan 2013
Modifié(e) : Youssef Khmou le 31 Jan 2013
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 commentaire
Youssef  Khmou
Youssef Khmou le 31 Jan 2013
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.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Operating on Diagonal Matrices dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by