MATLAB Answers

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

조회 수: 64(최근 30일)
Zac Minson
Zac Minson 2021년 9월 20일 16:02
편집: Matt J 2021년 9월 21일 19:17
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
Stephen 2021년 9월 21일 18:33
@Zac Minson: using a cell array is a very general method, which works for any number of matrices.

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

채택된 답변

Matt J
Matt J 2021년 9월 20일 16:36
편집: Matt J 2021년 9월 21일 19:17
Do you really need all Z{i} at the same time?
C=reshape( cat(N+1,C{:}) ,[],N);
Z=zeros(N^2,2^N); %EDITED - removed loops
Z=reshape(Z, N,N,[])
  댓글 수: 3
Zac Minson
Zac Minson 2021년 9월 21일 18:51
Thank you so much. I was really wracking my brain over how to generalize this problem. I appreciate your time.

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

추가 답변(2개)

Fangjun Jiang
Fangjun Jiang 2021년 9월 20일 16:46
for k=1:16
  댓글 수: 1
the cyclist
the cyclist 2021년 9월 20일 18:10
Here is a generalization of this solution:
N = 4; % Set this value
for k=1:2^N

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

Jan 2021년 9월 20일 17:20
편집: Jan 2021년 9월 21일 15:47
z = repmat(eye(4), 1, 1, 16);
z(z==1) = 1 - rem(floor((0:15) ./ [1; 2; 4; 8]), 2) * 2; % Inlined DEC2BIN
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 matrix. This is more efficient than storing them in a cell. But if you want this:
zC = num2cell(z, [1,2]);




Community Treasure Hunt

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

Start Hunting!

Translated by