2014-02-07 2 views
3

Я пытаюсь решить следующую простую задачу в MATLAB: enter image description hereДля петель итерации в MATLAB

Я пытаюсь сделать это, используя для петель. Однако я не понял этого.

Это то, что я придумал до сих пор:

n = [0:1:10]; 
b = 2*n; 
c = 0.5*n; 

B=0; 
for ii = 1:length(b) 
    for jj = 1:length(c) 
     B(ii) = B+sum(b(jj)*c(ii-jj)) 
    end 
end 

Похоже, я пришел в проблему, когда б = JJ и я с (0), и этот показатель не может быть использован. Как я могу это исправить?

ответ

2

Матовые индексы массивов от 1, поэтому элемент c(0) не существует. Самый простой способ, чтобы исправить это было бы добавить 1 к вашему выражению, так что, вероятно

B(ii) = B+sum(b(jj)*c(ii-jj+1)) 

но убедитесь, что это не дает вам офф на 1 ошибка на другом конце вектора.

В общем, поскольку Matlab индексирует значение с 1, вам необходимо учитывать это при переводе алгоритмов из источников, таких как ваше математическое выражение, индекс которого равен 0. Это та корректировка, которую приходится выполнять при записи программного обеспечения.

EDIT: как прокомментировал @Dan, вы также должны пересмотреть цикл над jj по номеру for jj = 1:ii.

+0

Вы также можете оставить вне в 'sum', так как это будет только когда-либо суммировался один номер – Dan

+0

Ну, да, но я отвечал на этот вопрос, не предоставляя услугу улучшения кода. В этом последнем смысле ваш ответ или @ RobertP лучше, чем мой, но мой объясняет, почему 'c (0)' не может быть использован. –

+0

Согласен, это лучший ответ. Но я думаю, что, чтобы быть полностью правильным, вы должны также отметить ошибку в 'для jj = 1: length (c)', поскольку она должна быть 'для jj = 1: ii'. «Сумма» вещь просто дополнительная. Но +1 в любом случае для объяснения ошибки – Dan

1

Итак, вам нужно поместить логику, как если бы (ii == jj) B (ii) = B + sum (b (jj) * c (ii-jj + 1)) Else B (ii) = B + sum (b (jj) * c (ii-jj)) Это псевдокод, поэтому вы можете преобразовать эту логику.

+2

Это не ответ, а комментарий. Поэтому я отметил, что он должен быть заменен комментарием. –

+1

Это не ответ, вы должны удалить его и повторно опубликовать в виде комментария к вопросу – Dan

+0

Итак, вам нужно поставить логику как , если (ii == jj) B (ii) = B + sum (b (jj) * c (ii-jj + 1)) Else B (ii) = B + sum (b (jj) * c (ii-jj)) Это псевдокод, поэтому вы можете преобразовать эту логику , –

1
N = 1:10; 
b = 2*N; 
c = 0.5*N; 

B=zeros(length(N),1); %//This preallocation of B makes your code much faster 

for n = N 
    for k = 1:n %//Note the change here 
     B(n) = B(n) + b(k)*c(n-k+1); %// Added the +1 to the index of c like High Performance Mark suggests but also note you don't need the sum() since b(k)*c(n-k+1) is only a single number anyways 
    end 
end 

или даже лучше, вы можете векторизации внутренний цикл:

for n = N 
    B2(n) = b(1:n)*c(n:-1:1)'; 
end 
7

Вы просто делаете свертку:

B = conv(b,c); 
B = B(1:numel(b)); %// remove unwanted values 
Смежные вопросы