Здесь нет полностью Векторизованным способ построения матрицы - нет петель, нет 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
Я использовал кучу временных переменные для ясности. Если вы хотите избежать захламления своего рабочего пространства, вы можете избежать их, поскольку они часто не используются более одного раза.
Также обратите внимание: это заполняет матрицу с помощью NaN, где вы не указали никакого другого значения. Если вы хотите заменить их другими стандартными (например, нулями или одними), что очень просто сделать в конце.
Хотите, чтобы векторизовать его, так как он медленный? Если это так, вы должны, по крайней мере, сначала выполнить предварительное распределение, а затем сохранить столбец результатов, так как matlab является столбцом. – Justin