Matrix with alternating signs in each row vector

Hi Guys,
Is there a way to improve on this code that I wrote to optimize it?
M = zeros(M,N); % create an MxN matrix
M(1,:) = 1; % Set first row to 1
for r = 2:I
M(r,:) = -M(r-1,:); %sets alternate rows to -1 and +1
end
a = M * diag(1 2 3 4 5);
so M creates:
M =
1 1 1 1 1
-1 -1 -1 -1 -1
1 1 1 1 1
-1 -1 -1 -1 -1
1 1 1 1 1
-1 -1 -1 -1 -1
1 1 1 1 1
-1 -1 -1 -1 -1
and a
a =
1 2 3 4 5
-1 -2 -3 -4 -5
1 2 3 4 5
-1 -2 -3 -4 -5
1 2 3 4 5
-1 -2 -3 -4 -5
1 2 3 4 5
-1 -2 -3 -4 -5
Is this the fastest and most efficient implementation to get the above? Thanks!

 Accepted Answer

Some improvement.
m=5;n=4;
M=ones(m,n);
M(2:2:end,:)=-1
Or alternative:
m=9;n=8;
a=(2*mod((1:m)',2)-1)*(1:n)

5 Comments

Another question!
I want to do now (assuming an MX8 matrix) column by column addition with vector k transposed:
N=8
k = [0 5 5 10 10 15 15 20]
for r = 1:N
b = k' + a(:,r);
end
Is a for loop the best way?
You just need this:
b=k'+sum(a,2)
Oops. I made a mistake in phrasing my question
N=8
k = [0 5 5 10 10 15 15 20]
for r = 1:N
b(:,r) = k' + a(:,r);
end
I want to add each column vector in a with k' and store them in b.
In other words, add column 1 in a with k' and store in column 1 of b, add column 2 in a with k' and store it in column 2 of b, etc.
I suggest that accept one of the answers here, assuming that it helped you. And make this comment into a separate question.
For that, you can use repmat.
b=repmat(k',1,N)+a

Sign in to comment.

More Answers (3)

One of many ways to get your result:
M = 7;
N = 5;
V = (-1).^(0:M);
A = bsxfun(@times,1:N,V')

3 Comments

The power operation is very expensive. Using MOD is much faster.
Hi Jan! My "research"
>> t = zeros(100,2);
for j1 = 1:100
tic,(-1).^(0:1000)'*(1:100);t(j1,1)=toc;
tic,(2*rem((1:1000)',2)-1)*(1:100);t(j1,2)=toc;
end
>> [min(t);mean(t);median(t);max(t)]
ans =
0.0008 0.0006
0.0012 0.0012
0.0012 0.0010
0.0030 0.0259

Sign in to comment.

b = bsxfun(@plus,k',a(:,1:N))
to your comment in the Fangjun's answer.
is there a generic way of making an array of ones that alternate form +1 to -1?

1 Comment

Why did you bury a brand-new question as a comment on a 3-year-old thread?

Sign in to comment.

Categories

Tags

Community Treasure Hunt

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

Start Hunting!