How to make an array of alternating 1 and -1?
71 views (last 30 days)
Show older comments
So far I have
xc = ones(1,12) for n=0:1:11 xc(n) = (-1).^n end
Mathematically, shouldn't it come out to an array of [1,-1,1,-1,1,-1,1,-1,1,-1]? I am getting this error:
"Subscript indices must either be real positive integers or logicals.
Error in test (line 3) xc(n) = (-1).^n"
0 Comments
Answers (4)
Star Strider
on 9 Dec 2017
MATLAB indexing begins with 1, not 0, so you have to adjust your code slightly:
xc = ones(1,12);
for n=1:12
xc(n) = (-1).^(n-1);
end
xcv = (-ones(1,12)).^(0:11); % Vectorised Version
The ‘vectorised version’ is simply to demonstrate how to use MATLAB’s vectorising ability to do the same operation.
2 Comments
Stephen23
on 9 Dec 2017
Why so complex?:
>> (-1).^(0:11)
ans =
1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
Bill Tubbs
on 31 Oct 2022
Even easier:
out = cumprod(-ones(1, 12))
out =
-1 1 -1 1 -1 1 -1 1 -1 1 -1 1
2 Comments
DGM
on 31 Oct 2022
Edited: DGM
on 31 Oct 2022
That's faster than I expected, but I guess it makes some sense.
N = 1E6;
timeit(@() f1(N))
timeit(@() f2(N))
timeit(@() f3(N))
timeit(@() f4(N))
timeit(@() f5(N))
timeit(@() f6(N))
function f1(N)
% slower than i expected
out = 2*rem(1:N,2) - 1;
end
function f2(N)
out = (-ones(1,N)).^(0:(N-1));
end
function f3(N)
out = (-1).^(0:(N-1));
end
function f4(N)
% faster than i expected
out = -cumprod(-ones(1,N));
end
function f5(N)
% only works if N is even!
out = reshape(repmat([1;-1],[1 N/2]),1,[]);
end
function f6(N)
% this is a bit slower and uglier than f5, but works for any N
out = reshape(repmat([1;-1],[1 ceil(N/2)]),1,[]);
out = out(1:N);
end
Bill Tubbs
on 31 Oct 2022
Nice! Thanks for pointing out the simplification (f3). I will update my comment.
Bill Tubbs
on 31 Oct 2022
Edited: Bill Tubbs
on 31 Oct 2022
Here's another way. A geometric series:
out = (-1).^(0:11)
out =
1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
0 Comments
See Also
Categories
Find more on Performance and Memory in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!