Here's a fully vectorized way to construct the matrix - no loops, no arrayfun:
PPR=[0 2 3 5 6 8];
AI=[ 0 0.7854 0.5236 0.3142 0.2618 0.1963];
M = ones(length(PPR),PPR(end)+1); #% allocate proper sized matrix of ones
r=1:length(PPR)-1; #% row indices for 1 element past the end of each row vector
c=PPR(1:end-1)+2; #% corresponding column indices
linear_index = sub2ind(size(M),r,c); #% create linear index from r,c
M(linear_index)=nan; #% set those elements to NaN
M2 = cumsum(M,2)-1; #% use cumsum to propagate the NaN values
M3 = bsxfun(@times,M2,AI'); #%'#multiply each row by the appropriate AI value
xp = sin(M3)+1 #% take the sine of the matrix
I've used a bunch of temporary variables for clarity. If you want to avoid cluttering your workspace, you can avoid them since they often aren't used more than once.
Also note: this fills the matrix with NaNs where you haven't specified any other value. If you wish to replace these with some other default (zeros or ones, for example) that is very straightforward to do at the end.