Quickest way for alternate indexing a vector

Hey,
I am looking for the quickest way to create a vector like this :
u = [5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49 53 55]
In which steps 2 and 4 alternate as you can see.
At the moment I manage to do it like this for instance :
u = 1+cumsum(repmat([4 2],[1 9]))
Where n is a given limit value. But this is too slow to me.
Would you know a way to get the same result but quicker ? Perhaps using only Matlab semi colon operator and / or basic math (+,*) operations ? EDIT : especially when u has a lot of elements.
Thank you.
Cheers,
Nicolas

2 Comments

hello
IMHO this seems not very slow
n = 1e6;
tic
u = 1+cumsum(repmat([4 2],[1 floor(n/6)]));
toc
Elapsed time is 0.003157 seconds.
size(u)
ans = 1×2
1 333332
Thank you all for your interest and solutions :-)
I am going to test them, pick the best in my case, and then choose for the corresponding best answer too.
I actually realize this challenge is very difficult since the goal in my case is nothing less than beating the semi colon operator indexing speed (!)
The only way I guess would be a real/direct semi-colon alternate indexing.

Sign in to comment.

 Accepted Answer

u = [5,7,11,13,17,19,23,25,29,31,35,37,41,43,47,49,53,55]
u = 1×18
5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49 53 55
v = 5:2:55;
v(3:3:end) = []
v = 1×18
5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49 53 55

4 Comments

This one is the closest, and I like its style :-)
But is it the fastest?
n=1e7;
timeit(@() version1(n))
ans = 0.2462
timeit(@() version2(n))
ans = 0.1315
timeit(@() version3(n))
ans = 0.1702
timeit(@() version4(n))
ans = 0.1461
function version1(n)
c=[4;2]; s=c(1)+c(2);
v = 1+s:2:s*n+1;
v(3:3:end) = [];
end
function version2(n)
c=[4;2];
s=c(1)+c(2);
c(2)=s;
u= 1 + c + (0:s:s*(n-1));
u=u(:).';
end
function version3(n)
c=[4;2];
s=c(1)+c(2);
clear u
u(2:2:2*n)=1+s:s:s*n+1;
u(1:2:2*n)=u(2:2:2*n)-c(2);
end
function version4(n)
c=[4;2];
s=c(1)+c(2);
u = [c(1)+1:s:s*(n-1)+c(1)+1; s+1:s:s*n+1];
u = reshape(u, 1, []);
end
version2 needs a finale reshape
Yep. I added it.

Sign in to comment.

More Answers (4)

n=9;c=[4;2];
s=c(1)+c(2);
c(2)=s;
u= 1 + c + (0:s:s*(n-1));
u=u(:)'
u = 1×18
5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49 53 55
n = 9;
u = [5:6:6*(n-1)+5; 7:6:6*(n-1)+7];
u = reshape(u, 1, [])
u = 1×18
5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49 53 55
n=9;c=[4;2];
s=c(1)+c(2);
clear u
u(2:2:2*n)=1+s:s:s*n+1;
u(1:2:2*n)=u(2:2:2*n)-c(2)
u = 1×18
5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49 53 55
Try to do something clever (1st and 2nd methods) but it is slower than your code 53rd method). A small modificationof your code seems to be the most efficient (last method)
test
Elapsed time is 0.028802 seconds. Elapsed time is 0.024224 seconds. Elapsed time is 0.002394 seconds. Elapsed time is 0.001397 seconds.
function test
n=1000000; % array length
tic
u=(5:3:(n-1)*3+5)-mod(0:n-1,2);
toc % Elapsed time is 0.010612 seconds.
tic
u=0:n-1;
u=5+3*u-mod(u,2);
toc % Elapsed time is 0.009249 seconds.
tic % Your method
u = 1+cumsum(repmat([4 2],[1 n/2]));
toc % Elapsed time is 0.002047 seconds.
tic % sligh modification method
u = repmat([4 2],[1 n/2]);
u(1)=5;
u = cumsum(u);
toc % Elapsed time is 0.001861 seconds.
end

Categories

Find more on Software Development Tools in Help Center and File Exchange

Products

Release

R2019b

Community Treasure Hunt

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

Start Hunting!