how to get following matrix using bsxfun

1 view (last 30 days)
I have a matrix x=[0 0 0;5 8 0; 7 6 0].
I want a matrix m=[0 0 0; 5 8 0 ; 7 6 0 ; 0 0 8; 5 8 8; 7 6 8; 0 0 16; 5 8 16; 7 6 16] I want that the third column of matrix x gets multiplied each time by 8 while other two columns remain same. I want this to continue until the value in third column reaches 72. how can i do it with bsxfun??

Accepted Answer

Geoff Hayes
Geoff Hayes on 7 Feb 2015
Saurabh - if x is your defined as
x=[0 0 0;5 8 0; 7 6 0];
then you could replicate it 10 times as
m = repmat(x,10,1);
then just replace the third column with
m(:,3) = cell2mat(arrayfun(@(u)repmat(u*8,3,1),0:9,'UniformOutput',false)');
to produce the desired result. Try the above and see what happens!
  3 Comments
Ace_ventura
Ace_ventura on 7 Feb 2015
Edited: Ace_ventura on 7 Feb 2015
can it be done using bsxfun?? And what if i wanted to add certain constant to 1 and 2 column as well continuously throughout. Say addition of 5 throughout entire columnn1 and addition of 9 throughout entire column 2 with each repetition of matrix. Thanks in advance:)
Geoff Hayes
Geoff Hayes on 8 Feb 2015
Saurabh - try the following
x=[0 0 0;5 8 0; 7 6 0];
cell2mat(arrayfun(@(u)x + repmat([u*5 u*9 u*8],3,1),0:9, 'UniformOutput',false)')
5, 9, and 8 are added to columns 1, 2, and 3 respectively of each new matrix. We use repmat to create the matrix to add to x at each iteration u. We apply this add using arrayfun for iterations 0 through 9. The result is a cell array, so we transpose the output from arrayfun and convert to a matrix using cell2mat.

Sign in to comment.

More Answers (1)

Andrei Bobrov
Andrei Bobrov on 7 Feb 2015
Edited: Andrei Bobrov on 7 Feb 2015
k = 0:72/8;
M = repmat(x,numel(k),1);
add = 8*ones(size(x,1),1)*k;
M(:,3) = add(:);
with bsxfun
m = reshape(bsxfun(@plus,permute(x,[1 3 2]),...
bsxfun(@times,reshape([0 0 1],1,1,[]),0:72/8)),[],3);
  1 Comment
Ace_ventura
Ace_ventura on 8 Feb 2015
Thanks Andrei..Could u also answer my second question. what if i wanted to add a constant to column 1 and column2 with each matrix repetition. That is to say,if my constant to be added is 5 ,then my first column in second repetition of matrix is 5 10 12 and second column becomes 5 13 11. In third repetition first column becomes 10 15 17 and second column becomes 10 18 16 and so on. During this entire process my third column goes on with addition of 8 each time ( as u have answered)

Sign in to comment.

Categories

Find more on Matrices and Arrays 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!