# populate matrix columns based on a vector of index vector

10 views (last 30 days)
MatG on 12 Jun 2020
Edited: Stephen Cobeldick on 12 Jun 2020
I generate an 8x8 A matrix below. I also have an 8x1 vector B containing random integer numbers from 1 to 8. And, I have an 8x1 C vector containing numbers obtained below. How can I, for all rows of A, populate those columns of A starting at B to the end, with values of corresponding rows in C without going through a loop (i.e. vectorized).
A=rand(8);
B = randi([1 8], 8, 1);
C=-linspace(8,30,8)';
##### 2 CommentsShowHide 1 older comment
MatG on 12 Jun 2020
Imagine
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]
And
B = [1 3 4 2 5]
C = [-10 -9 -5 -2 -1];
Then, I want A(1,B(1):end) = C(1), A(2,B(2):end) = C(2), ....
So I get:
A = [-10 -10 -10 -10 -10
1 2 -9 -9 -9
1 2 3 -5 -5
1 -2 -2 -2 -2
1 2 3 4 -1]

Stephen Cobeldick on 12 Jun 2020
Edited: Stephen Cobeldick on 12 Jun 2020
>> X = (1:5)>=B(:); % requires >=R2016b, for earlier versions replace >= with BSXFUN
>> [R,~] = find(X);
>> A(X) = C(R)
A =
-10 -10 -10 -10 -10
1 2 -9 -9 -9
1 2 3 -5 -5
1 -2 -2 -2 -2
1 2 3 4 -1