Я бы использовал diag
и cumprod
, чтобы помочь вам в этом. Сначала используйте diag
, чтобы извлечь диагонали вашей матрицы Q
. После этого используйте cumprod
для создания вектора совокупных продуктов.
Как cumprod
работает с вектором, так это то, что для каждого элемента вектора i-й элемент собирает продукты от 1 до i-го элемента. Например, если бы у нас был вектор V = [1 2 3 4 5]
, cumprod(V)
дал бы [1 2 6 24 120]
. 4-й элемент (в качестве примера) будет 1*2*3*4
, представляющим продукты с 1-го по 4-й элемент.
Таким образом, это код, который я бы сделал:
qdiag = diag(Q);
xMinusZ = x - z; % Takes z and does x - z for every element in z
cumProdRes = cumprod(xMinusZ);
P = sum(qdiag .* [1;cumProdRes(1:end-1)]);
P
должно дать вам P(x)
то, что вы хотели. Убедитесь, что z
является вектором-столбцом, чтобы сделать его совместимым с диагоналями, извлеченными из Q
.
Примечание: я полагаю, что в вашем уравнении допущена опечатка. Последний член вашего уравнения (согласно вашему соглашению) должен иметь (x-z(2n-1))
, а не (x-z(2n))
. Это потому, что первый член в вашем уравнении не имеет z
.
Вот пример. Предположим, что Q
определено
Q = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];
Вектор z
:
z = [4;3;2;1];
Давайте оценим функцию в x = 2
Извлечение диагоналей Q
должно дать нам Q = [1;6;11;16]
. Вычитание x
из каждого элемента z
должно дать нам:
xMinusZ = [-2;-1;0;1];
Используя уравнение, которое у вас есть выше, мы имеем:
P = 1 + 6*(-2) + 11*(-2)*(-1) + 16*(-2)*(-1)*(0) = 11
Вот что должен дать код.
Что, если мы хотим сделать это для более чем одного значения x?
Как вы указали в своем посте, вы хотите оценить это для ряда значений x
. Таким образом, вам нужно изменить код, чтобы он выглядел так (убедитесь, что x
является вектором-столбцом):
qdiag = diag(Q);
xMinusZ = repmat(x,1,length(z)) - repmat(z',length(z),1);
cumProdRes = cumprod(xMinusZ,2);
P = sum(repmat(qdiag',length(z),1).*[ones(length(z),1) cumProdRes(:,1:end-1)],2);
P
теперь должен дать вам вектор выходных данных, поэтому, если вы хотите построить это, просто выполните plot(x,P);
person
rayryeng
schedule
04.05.2014