change one column of matrix

I have A
A=[1,0,4,0,5,0;0,1,0,3,-1,0;0,4,0,0,0,8];
B=[1.2,-1,-2.1,-1.3,-1.4,1;-2.1,1.3,-1,-2,-3,-1.8;1.9,-1.2,3.1,2.7,2.5,-0.5];
index=2;
I want to add nonzero element in A to corresponding B element.
A(index,:)=B(index,A(index, :)~=0)+A(index, :);
result should be
A=[1,0,4,0,5,0; 0, 1+1.3,0,3-2,-1-3,0; 0,4,0,0,0,8];

 Accepted Answer

mask = A(index, :) ~= 0;
A(index, mask) = A(index, mask) + B(index, mask) ;

3 Comments

NA
NA on 28 Jul 2019
Edited: NA on 28 Jul 2019
if index=[2;3;4]
A=[1,0,4,0,5,0;0,1,0,3,-1,0;0,4,0,0,0,8; 1,0,4,0,5,0;0,1,0,3,-1,0;0,4,0,0,0,8];
B=[1.2,-1,-2.1,-1.3,-1.4,1;-2.1,1.3,-1,-2,-3,-1.8;1.9,-1.2,3.1,2.7,2.5,-0.5 ;1.2,-1,-2.1,-1.3,-1.4,1;-2.1,1.3,-1,-2,-3,-1.8;1.9,-1.2,3.1,2.7,2.5,-0.5];
index=[2;3;4];
mask = A(index, :) ~= 0;
A(index, mask) = A(index, mask) + B(index, mask) ;
I have this error
The logical indices in position 2 contain a true value outside of the
array bounds.
NA
NA on 28 Jul 2019
Edited: NA on 28 Jul 2019
I use this one but it makes program slow, if the size of A is big. Is there any better way?
mask = A(index, :) ~= 0;
for i=1:size(mask,1)
A(index(i), mask(i,:)) = A(index(i), mask(i,:)) + B(index(i), mask(i,:)) ;
end
Andrei's solution looks good.

Sign in to comment.

More Answers (1)

A(index,:) = A(index,:) + B(index,:).*(A(index,:) ~= 0);

Categories

Find more on Operators and Elementary Operations 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!