В настоящее время n
является вектором, k
является скаляром, а n<k
возвращает логический вектор. Если вы непосредственно используете if
, это будет то же самое, что и if all(n)
, который вернет true, только когда все в этом векторе истинно! Это неожиданное поведение.
Я не знаю, есть ли общий способ векторизации кодов с if
. Но в вашем случае я могу сделать это следующим образом.
% use indice to deal with if
for k=1:length(zi)
y(1:k-1)=y(1:k-1)+b(k)*zi(length(zi)+2-k:end);
y(k:end)=y(k:end)+b(k)*x(1:length(x)-k+1);
end
Я также заметил, что на самом деле, если вы cat
zi
и x
, нет необходимости использовать 2 отдельных утверждения.
% assume both zi & x to be column vector
ziandx=[zi;x];
for k=1:length(zi)
y=y+b(k)*ziandx(length(zi)+2-k:length(zi)+length(x)-k+1);
end
Наконец, даже этот цикл for не нужен, если вы используете conv
. (проверьте документ для более подробной информации)
ziandx=[zi;x];
s=conv(b(1:length(zi)),ziandx);
y=s(length(zi)+1:length(zi)+length(x))
Я рекомендую вам прочитать все три метода и понять идею, поэтому вы можете сделать это самостоятельно в следующий раз.