How do I access and modify only the non diagonal entries in a matrix?

hello.. i hv a question. what is the command to call the non diagonal entries of a matrix? tq very much...

 采纳的回答

Please try the following:
M = 8;
N = 5;
X = randn(M,N);
idx = eye(M,N);
Y = (1-idx).*X;
Z = X(~idx);
HTH.
Best, Rick
Responding to your comment:
To multiply the non-diagonal elements by 2, please try:
A = [2 3 5;3 6 8;5 8 4];
idx = eye(size(A));
idx = idx + 2*(1-idx);
Y = idx.*A;
HTH.
Best, Rick

4 个评论

eg: i have 3x3 matrix. A = [2 3 5;3 6 8;5 8 4]. then , i want to multiply all the off-diagonal entries by 2. Can i use ur recommended code in my situation? tq for ur cooperation.
Do you want to keep the diagonal entries as well, or do you want to zero them out? Also, do you want the result to be a 3x3 matrix, or a 6x1 column vector (eliminating the 3 diagonal elements)? Please let me know.
i wanna keep the diagonal entries as well..and i also want the result also in 3x3 matrix..tq

请先登录,再进行评论。

更多回答(4 个)

If tmp is your matrix, try:
tmp-diag(diag(tmp)) %works only with square matrices
OR
triu(tmp,1)+tril(tmp,-1)
Both of these set the diagonal entries to zero, essentially ignoring them. If this isn't what you want, please clarify.

5 个评论

eg: i have 3x3 matrix. A = [2 3 5;3 6 8;5 8 4]. then , i want to multiply all the off-diagonal entries by 2. is it clear enough? tq for ur cooperation.
i used the 1st one from ur answer.. tq very2 much... :)
You could either do the above methods and multiply (.*) the result by 2, or use indexing as such:
idx = find(~eye(size(A))); %get NON diagonal entries
A(idx) = A(idx).*2;
yup.. A.*2-diag(diag(A)) is the one i'm searching for.. i forgot to mentioned that i wanna keep the diagonal entries as well.. anyway, tq..

请先登录,再进行评论。

i want to keep both diagonal in matrix size i don't know, defined by n, and all other elements to multiply by them self plus 1. tnx

1 个评论

Please open up a new question for this, and provide a short example in that new question.

请先登录,再进行评论。

Another way for a square matrix:
M = your matrix
x = ~logical(eye(size(M)));
M(x) = 2*M(x); % <-- or whatever function you want on the rhs using M(x)
hi can someone tell me how to compute sum of no diagonal entries.

1 个评论

M = magic(4) % some square matrix
M = 4x4
16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
idx = ~eye(size(M)) % logical index indicating non-diagonal entries
idx = 4x4 logical array
0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0
result = sum(M(idx),'all') % sum the non-diagonal entries
result = 102

请先登录,再进行评论。

类别

帮助中心File 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