how set diagonal =1 in matrix tridimensional a(:,:,:)
Ältere Kommentare anzeigen
hi,
how can i set=1 the diagonal of the multidimensional matrix
size(COR)
ans =
8 8 188
8 Kommentare
Walter Roberson
am 20 Jul. 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
am 20 Jul. 2023
aldo
am 20 Jul. 2023
Bruno Luong
am 20 Jul. 2023
Bearbeitet: Bruno Luong
am 20 Jul. 2023
So you have for-loop that seems correct and arguably preferable to all answers you'll get. Why asking the question?
aldo
am 20 Jul. 2023
aldo
am 20 Jul. 2023
Bruno Luong
am 20 Jul. 2023
Bearbeitet: Bruno Luong
am 20 Jul. 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
am 20 Jul. 2023
Antworten (3)
Maybe using eye and repmat
COR = repmat(eye(8),1,1,188);
size(COR)
3 Kommentare
aldo
am 20 Jul. 2023
Walter Roberson
am 20 Jul. 2023
M = repmat(logical(eye(size(COR,1),sie(COR,2))),1,1,size(COR,3));
COR(M) = 1;
aldo
am 20 Jul. 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
Kategorien
Mehr zu Operating on Diagonal Matrices finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!