how set diagonal =1 in matrix tridimensional a(:,:,:)
Afficher commentaires plus anciens
hi,
how can i set=1 the diagonal of the multidimensional matrix
size(COR)
ans =
8 8 188
8 commentaires
Walter Roberson
le 20 Juil 2023
Are you looking for the diagonal on each "page", so all 118 layers the same?
Or are you looking for the "space diagonal" -- (1,1,1), (2,2,2), up to (8,8,8) with everything else 0?
aldo
le 20 Juil 2023
aldo
le 20 Juil 2023
Bruno Luong
le 20 Juil 2023
Modifié(e) : Bruno Luong
le 20 Juil 2023
So you have for-loop that seems correct and arguably preferable to all answers you'll get. Why asking the question?
aldo
le 20 Juil 2023
aldo
le 20 Juil 2023
Bruno Luong
le 20 Juil 2023
Modifié(e) : Bruno Luong
le 20 Juil 2023
Here is the timings of three methods
COR = rand(8,8,188);
timeit(@() methodfor(COR)) % Aldo
timeit(@() methodlogical(COR)) % Walter
timeit(@() methodindex(COR)) % Bruno
function COR = methodfor(COR)
[r,c,d]=size(COR);
for i=1:d
for x=1:r
COR(x,x,i)=1;
end
end
end
function COR = methodlogical(COR)
M = repmat(logical(eye(size(COR,1),size(COR,2))),1,1,size(COR,3));
COR(M) = 1;
end
function COR = methodindex(COR)
[b,c,d] = size(COR);
COR(1+(b+1)*(0:min(b,c)-1)'+b*c*(0:d-1)) = 1;
end
aldo
le 20 Juil 2023
Réponses (3)
Maybe using eye and repmat
COR = repmat(eye(8),1,1,188);
size(COR)
3 commentaires
aldo
le 20 Juil 2023
Walter Roberson
le 20 Juil 2023
M = repmat(logical(eye(size(COR,1),sie(COR,2))),1,1,size(COR,3));
COR(M) = 1;
aldo
le 20 Juil 2023
% Generate dummy test data
a = 0.01*rand(2,3,4)
[b,c,d] = size(a);
[I,K] = ndgrid(1:min(b,c),1:d);
a(sub2ind([b,c,d],I,I,K)) = 1;
a
% Generate dummy test data
a = 0.01*rand(2,3,4)
[b,c,d] = size(a);
a(1+(b+1)*(0:min(b,c)-1)'+b*c*(0:d-1)) = 1;
a
Catégories
En savoir plus sur Region and Image Properties dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!