How can I iterate across the opposite diagonal?

10 visualizaciones (últimos 30 días)
Karen Smith
Karen Smith el 24 de Dic. de 2021
Editada: DGM el 25 de Dic. de 2021
Hi everyone, I am new to matlab and trying to build a matrix in it. I am wanting to know how to iterate across the other diagonal, opposite to where the 6's are. If anyone can do this with a similar for loop, all help would be appreciated. Thank you!
N1=2;
N2=2;
nband=1;
n= (N1* N2)*2*nband;
eps_s=1;
eps_sp=2;
eps_spp=3;
tp=4;
tps=5;
HM = zeros(n);
for ii = 1:n
HM(ii,ii) = 6; % (ii,ii) = eps_s
HM(ii,ii+1) = 4;
HM(ii+1,ii) = 4
end
  3 comentarios
Karen Smith
Karen Smith el 25 de Dic. de 2021
pls elaborate if possible!!
Torsten
Torsten el 25 de Dic. de 2021
If you set
for ii = 1:n
HM(ii,n+1-ii) = 6;
end
you set the opposite diagonal to 6.
For ii=1, you set HM(1,n) = 6.
For ii=2, you set HM(2,n-1) = 6.
...
For ii=n, you set HM(n,1) = 6.

Iniciar sesión para comentar.

Respuestas (3)

Image Analyst
Image Analyst el 25 de Dic. de 2021
At the end of your loop, just add
HM = fliplr(HM);
or else here is one way:
N1=2;
N2=2;
nband=1;
n= (N1* N2)*2*nband;
eps_s=1;
eps_sp=2;
eps_spp=3;
tp=4;
tps=5;
HM = zeros(n);
for ii = 1:n
col = n-ii+1;
if col <= n && col >= 1
HM(ii, col) = 6; % (ii,ii) = eps_s
end
col = n-ii+2;
if col <= n && col >= 1
HM(ii, col) = 4;
end
col = n-ii;
if col <= n && col >= 1
HM(ii, col) = 4;
end
end
HM

Sean de Wolski
Sean de Wolski el 25 de Dic. de 2021
full(flip(gallery('tridiag', 8, 4, 6, 4), 2))
ans = 8×8
0 0 0 0 0 0 4 6 0 0 0 0 0 4 6 4 0 0 0 0 4 6 4 0 0 0 0 4 6 4 0 0 0 0 4 6 4 0 0 0 0 4 6 4 0 0 0 0 4 6 4 0 0 0 0 0 6 4 0 0 0 0 0 0

DGM
DGM el 25 de Dic. de 2021
Editada: DGM el 25 de Dic. de 2021
You can also do:
HM = fliplr(toeplitz([6 4 zeros(1,7)]))
HM = 9×9
0 0 0 0 0 0 0 4 6 0 0 0 0 0 0 4 6 4 0 0 0 0 0 4 6 4 0 0 0 0 0 4 6 4 0 0 0 0 0 4 6 4 0 0 0 0 0 4 6 4 0 0 0 0 0 4 6 4 0 0 0 0 0 4 6 4 0 0 0 0 0 0 6 4 0 0 0 0 0 0 0
That said, it's unclear whether you're actually intending for the output to be 8x8 or 9x9. You assert n=8, and you preallocate an 8x8 array, but your indexing forces the array to be expanded to 9x9. Consequently, you're missing a 6 in the corner element. If the desired output is only 8x8, then that's as simple as changing the number of zeros.
HM = fliplr(toeplitz([6 4 zeros(1,6)]))

Categorías

Más información sobre Operating on Diagonal Matrices en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by