Filter löschen
Filter löschen

hi everyone , how can I built a matrix of circularly shifted array in efficient way

5 Ansichten (letzte 30 Tage)
I have a given initial array of length M , I want to built a matrix of MxM , by circularly shifting this array, example
for array=[2,0,0] the matrix should be matrix=[2,0,0;0,2,0;0,0,2]
my code works but it not efficient for large M I would be happy if someone can gives me an efficient suggestion
my code:
array=[2,0,0]; % given Initial array
M=length(array);
mat=zeros(M,M);%matrix
mat(1,:)=array;
for i=2:M
array=circshift(array(1,1:M),[0 1]);
mat(i,:)=array;
end

Akzeptierte Antwort

Stephen23
Stephen23 am 19 Feb. 2018
Bearbeitet: Stephen23 am 19 Feb. 2018
Multiple circshift calls in a loop is not required. One call to toeplitz is simpler:
>> V = [2,0,0];
>> toeplitz(V([1,end:-1:2]),V)
ans =
2 0 0
0 2 0
0 0 2
Or a clearer example:
>> V = [4,3,2,1,0];
>> toeplitz(V([1,end:-1:2]),V)
ans =
4 3 2 1 0
0 4 3 2 1
1 0 4 3 2
2 1 0 4 3
3 2 1 0 4

Weitere Antworten (1)

Guillaume
Guillaume am 19 Feb. 2018
Bearbeitet: Guillaume am 19 Feb. 2018
To be compared to a loop version, it's very possible that a loop is faster:
array = [2, 0, 0];
shiftidx = hankel(1:numel(array), circshift(1:numel(array), 1))
M = array(shiftidx)
Or, for a shift in the other direction:
array = [2, 0, 0];
shiftidx = toeplitz(1:numel(array), [1, numel(array):-1:2])
M = array(shiftidx.')

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by