How to make an array of alternating 1 and -1?

조회 수: 76 (최근 30일)
Samantha Horton
Samantha Horton 2017년 12월 9일
편집: Bill Tubbs 2022년 10월 31일
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"

답변 (4개)

Andrei Bobrov
Andrei Bobrov 2017년 12월 9일
out = 2*rem(1:12,2) - 1

Star Strider
Star Strider 2017년 12월 9일
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
Stephen23
Stephen23 2017년 12월 9일
Why so complex?:
>> (-1).^(0:11)
ans =
1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
Zachery Vrbas
Zachery Vrbas 2022년 10월 29일
It was so obvious.
Thank you, good sir

댓글을 달려면 로그인하십시오.


Bill Tubbs
Bill Tubbs 2022년 10월 31일
Even easier:
out = cumprod(-ones(1, 12))
out =
-1 1 -1 1 -1 1 -1 1 -1 1 -1 1
  댓글 수: 2
DGM
DGM 2022년 10월 31일
편집: DGM 2022년 10월 31일
That's faster than I expected, but I guess it makes some sense.
N = 1E6;
timeit(@() f1(N))
ans = 0.0230
timeit(@() f2(N))
ans = 0.0240
timeit(@() f3(N))
ans = 0.0231
timeit(@() f4(N))
ans = 0.0020
timeit(@() f5(N))
ans = 1.7284e-04
timeit(@() f6(N))
ans = 0.0010
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
Bill Tubbs 2022년 10월 31일
Nice! Thanks for pointing out the simplification (f3). I will update my comment.

댓글을 달려면 로그인하십시오.


Bill Tubbs
Bill Tubbs 2022년 10월 31일
편집: Bill Tubbs 2022년 10월 31일
Here's another way. A geometric series:
out = (-1).^(0:11)
out =
1 -1 1 -1 1 -1 1 -1 1 -1 1 -1

카테고리

Help CenterFile Exchange에서 Performance and Memory에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by