2013-04-30 2 views
0

У меня есть переменная величина, содержащая два вектора. Я хочу суммировать эти величины от i = 1 до n, где n = 100. Когда программа запущена, я могу щелкнуть по переменным в рабочем пространстве, чтобы увидеть значения элементов векторов для каждой позиции столбца. При выполнении переменной ее положения я получаю соответствующее значение (например, z (1) = 73.2360, z (2) = 63.3701, .... и т. Д.). Но то, что я не могу понять, это то, как индексировать те векторы для суммы, пробегающей элементы двух векторов. Например, в цикле for. Я также взглянул на symsum(), но для этого нужны только общие переменные. Я пытаюсь суммировать epsilon от i = 1 до 100, где z_i и w_i - представляющие интерес векторы. Я надеюсь, что MWE покажет больше того, чего я хочу достичь.Как суммировать элементы векторов

MWE:

a = 0.6; 
b = sqrt(16-a^2); 
c = 6.5; 
d = sqrt(225-c^2); 
xh = randn(1,100); 
yw = randn(1,100); 
    z = a*xh + b*yw + 68; 
    w = c*xh + d*yw + 160; 

    n = 100;        % # of data entries. 
    zbar = ((1/n)*sum(z));     % Height data. 
    wbar = ((1/n)*sum(w));     % Weight data. 
Zbarv = zbar*ones(1,100);     % Height data vector. 
Wbarv = wbar*ones(1,100);     % Weight data vector. 

sz = sqrt((1/n)*((z-Zbarv)*(transpose(z)-transpose(Zbarv))));    
sw = sqrt((1/n)*((w-Wbarv)*(transpose(w)-transpose(Wbarv)))); 

czw = ((1/n)*(w-Wbarv)*(transpose(z)-transpose(Zbarv))); 
rzw = czw/(sz*sw); 

b = wbar - ((czw/sz^2)*zbar);    % y-intercept 
m = czw/sz^2;        % Slope 
epsilon = (1/(n-1))*sum((w-(m*z+b)).^2); % Error 

Эпсилон следует суммированием, но должна быть сумма от i=[1,100]. Я не знаю, как индексировать значения векторов w_i и z_i для того, чтобы сумма их пропустила. Я пробовал сделать для них входную переменную вроде z(i) и w(i), но получился беспорядочным.

Любые предложения?

+0

Итак, вы хотите рассчитать сумму первых элементов i для каждого значения 'i' между 1 и 100? –

ответ

1

Это звучит, как вы просто хотите:

epsilon = (1/(n-1))*sum((w(1:100)-(m*z(1:100)+b)).^2); 

Хотя, так как вы w и z длиной всего 100 элементов, я думаю, что это то же самое, что вы сделали. Поэтому я считаю, что ваш код действительно правильный, поскольку он стоит.

Например, если a = [1 2 3], то sum(a) является 6, вы на самом деле не индексировать a, чтобы получить сумму. Таким образом, ваш код набирает сумму из всех 100 элементов.

Вы должны читать на Matlab colon operator

Основная идея заключается в том, что в MatLab что-то вроде 1:10 просто короткая рука для [1 2 3 4 5 6 7 8 9 10], и вы можете использовать его для индексирования вектора. Итак, если у нас есть вектор v = rand(100,1), то для получения первых 10 элементов v это просто v(1:10)

+0

Не думайте, что этого хочет OP. 'x' и' z' уже имеют 100 выборок, индексирование двоеточия является излишним. –

+0

@EitanT Да, я согласен, я так сказал в ответе. Я думаю, что код OPs правильный tbh. – Dan

+1

@ Dan: Я тоже проверил код, и я думаю, что вы правы! Но, возможно, ОП ищет какую-то кумулятивную сумму? В противном случае вопрос звучит довольно загадочно для меня. – fpe

Смежные вопросы