После этого бита:
[lena, lenb]=size(obj_arr);
if (lena==1)&&(lenb>1)
obj_arr=obj_arr';
len=lena;
elseif (lena>1)&&(lenb==1)
len=lenb;
elseif (lena==1)&&(lenb==1)
len=lena;
else
error('at least one dimention must be 1')
end
len
всегда равен 1. Далее, у вас есть цикл:
for i=1:len-1
, который никогда не запустится.Вы берете i
из массива 1:(1-1) == 1:0 = []
.Таким образом, цикл всегда пропускается.
Вы, вероятно, хотели, чтобы len
имела длину входного вектора.Вместо этого вы можете использовать isvector
и length
:
if ~isvector(obj_arr)
error('at least one dimension must be 1')
end
len = length(obj_arr);
Обратите внимание, что length(obj_arr)
совпадает с max(size(obj_arr))
.isvector
может быть реализовано как nnz(size(obj_arr)>1)==1
(т. Е. Число измерений больше 1 равно 1) или, если использовать 2D-матрицу, как вы делали это в своем коде, any(size(obj_arr)==1)
.
Далее убедитесь, что циклпроходит через все элементы вектора:
for i=1:len
По соображениям эффективности вы должны определить свою функцию как
function obj_arr = minus(obj_arr,filt)
Это позволит MATLAB лучше оптимизировать определенные вызовы вашегофункция, избегая ненужных копий при работе на месте (например, arr=arr-1
).