How can I create a set of N diagnal matrices range from diag(1, 1, ... , 1) to diag(-1, -1, ... , -1) for testing purposes?

1 vue (au cours des 30 derniers jours)
I am needing to create 16 4x4 diagnal matrices consisting of all of the combinations of "1" and "-1" and have them be able to be called for use in a loop. Besides creating each individual matrix, how can I go about accomplishing this?
for instance:
Z1 = diag(1,1,1,1);
.
Z8 = diag(1,-1,-1,1);
.
Z16 = diag(-1,-1,-1,-1);
Thank you for any guidance.
  3 commentaires
Zac Minson
Zac Minson le 20 Sep 2021
I ended up doing this, but was wondering if there is a more general method in the case of 2^N matrices.
Stephen23
Stephen23 le 21 Sep 2021
@Zac Minson: using a cell array is a very general method, which works for any number of matrices.

Connectez-vous pour commenter.

Réponse acceptée

Matt J
Matt J le 20 Sep 2021
Modifié(e) : Matt J le 21 Sep 2021
Do you really need all Z{i} at the same time?
[C{1:N}]=ndgrid([-1,1]);
C=reshape( cat(N+1,C{:}) ,[],N);
Z=zeros(N^2,2^N); %EDITED - removed loops
Z(1:N+1:N^2,:)=C;
Z=reshape(Z, N,N,[])
  3 commentaires
Matt J
Matt J le 20 Sep 2021
Here's a loop-free version:
N = 4; % Set this value
[C{1:N}]=ndgrid([-1,1]);
C=reshape( cat(N+1,C{:}) ,[],N).';
Z=zeros(N^2,2^N);
Z(1:N+1:N^2,:)=C;
Z=reshape(Z, N,N,[])
Z =
Z(:,:,1) = -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 Z(:,:,2) = 1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 Z(:,:,3) = -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 -1 Z(:,:,4) = 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 -1 Z(:,:,5) = -1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 -1 Z(:,:,6) = 1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 -1 Z(:,:,7) = -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 -1 Z(:,:,8) = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 -1 Z(:,:,9) = -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 Z(:,:,10) = 1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 Z(:,:,11) = -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 Z(:,:,12) = 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 Z(:,:,13) = -1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 1 Z(:,:,14) = 1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 1 Z(:,:,15) = -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 Z(:,:,16) = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
Zac Minson
Zac Minson le 21 Sep 2021
Thank you so much. I was really wracking my brain over how to generalize this problem. I appreciate your time.

Connectez-vous pour commenter.

Plus de réponses (2)

Fangjun Jiang
Fangjun Jiang le 20 Sep 2021
a=(dec2bin(15:-1:0)-48)*2-1;
z=zeros(4,4,16);
for k=1:16
z(:,:,k)=diag(a(k,:));
end
  1 commentaire
the cyclist
the cyclist le 20 Sep 2021
Here is a generalization of this solution:
N = 4; % Set this value
a=(dec2bin((2^N-1):-1:0)-48)*2-1;
z=zeros(N,N,2^N);
for k=1:2^N
z(:,:,k)=diag(a(k,:));
end

Connectez-vous pour commenter.


Jan
Jan le 20 Sep 2021
Modifié(e) : Jan le 21 Sep 2021
z = repmat(eye(4), 1, 1, 16);
z(z==1) = 1 - rem(floor((0:15) ./ [1; 2; 4; 8]), 2) * 2; % Inlined DEC2BIN
Generalized:
n = 3;
z = repmat(eye(n), 1, 1, 2^n);
z(z==1) = 1 - rem(floor((0:2^n-1) ./ pow2(0:n-1).'), 2) * 2;
Now z(:,:,i) is the i.th matrix. This is more efficient than storing them in a cell. But if you want this:
zC = num2cell(z, [1,2]);

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Produits


Version

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by