subtracting matrices in a special way

1 view (last 30 days)
AA
AA on 1 Dec 2014
Edited: Stephen23 on 1 Dec 2014
a = randi(50,600,9);
mx = randi(50,60,1);
q = bsxfun(@minus,reshape(a(:,7),10,[]),mx);
q = reshape(q,[],1);
After reshaping and cutting the variable 'a' into 10 blocks I want the first mx value to be subtracted from the first block of ten, the second mx value from the second block of 10, the third mx value from the third block of 10 and so on.... How can I implement these changes in my bsxfun function?
thanks
  7 Comments
AA
AA on 1 Dec 2014
you are right. I forgot to mention the condition that the rows of variable a are always a multiple of mx/mn. Thus
a = randi(50,600,9);
mx = randi(50,60,1);
mn = randi(50,60,1);
I wish to subtract mx(1) from the first ten consecutive values of a. q(1:10) = a(1:10) - mx(1) q(11:20)=a(11:20)-mx(2) ... q(591:600)=a(591:600)-mx(60).
Stephen23
Stephen23 on 1 Dec 2014
PS: Is there a purpose to creating a huge array a and then using only the seventh column from it?

Sign in to comment.

Accepted Answer

Stephen23
Stephen23 on 1 Dec 2014
Edited: Stephen23 on 1 Dec 2014
Using the arrays that you specified in your most recent comment:
a = randi(50,600,9);
mx = randi(50,60,1);
mn = randi(50,60,1);
b = reshape(a(:,7),10,[]).';
q = bsxfun(@minus,b,mx);
%q = bsxfun(@rdivide,q,mx-mn);
%q = reshape(q.',[],1);

More Answers (1)

Andrei Bobrov
Andrei Bobrov on 1 Dec 2014
Edited: Andrei Bobrov on 1 Dec 2014
a = randi(50,600,9);
mx = randi(50,60,1);
a7 = reshape(a(:,7),10,[]);
out0 = bsxfun(@minus,a7,mx(:)');
out = out0(:);
or
out = a(:,7) - mx(ceil((1:size(a,1))/numel(mx)));

Community Treasure Hunt

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

Start Hunting!