Перегрузка оператора для массива элементов - PullRequest
0 голосов
/ 12 октября 2018

Я создал класс и хотел бы добавить перегрузку оператора для minus.Я написал код, и он прекрасно работает, если я ввожу только один элемент, однако функция, которую я написал, должна работать для нескольких элементов.

Когда я пытаюсь ввести массив, (array of elements)-(one element), он должен "вычесть "def из каждого элемента arr и вернуть новый массив элементов.

Это код:

  function this=minus(obj_arr,filt)
        [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

        [lenfa,lenfb]=size(filt);
        if (lenfa~=1)||(lenfb~=1)
            error('filter must be 1x1')
        end


        difference=mean(filt.filtered_pf_arr);
        [~,max_val]=max(difference);
        for i=1:len-1

            temp_filt_pf=obj_arr(i).filtered_pf_arr;
            [num_calls,num_fr]=size(temp_filt_pf);
            for ii=1:num_calls
                new_temp_filf_pf=zeros(num_calls,num_fr);
                temp_mean_filt_pf=temp_filt_pf(ii,:);

                max_val_temp=temp_mean_filt_pf(max_val);
                few_def=difference.*max_val_temp;
                new_temp_filf_pf(ii,:)=temp_filt_pf(ii,:)-few_def;
            end
            obj_arr(i).filtered_pf_arr=new_temp_filf_pf;

        end
        this=obj_arr;

Это работает, когда я вводю одно командное окно

arr- an array of elements of the class
elementx- an element of class

elementA-elementB
classname.minus(arr,elementx)
arr(1)-elementx

Не работает при вводе

arr-elementx

ошибка: не найдено метода «минус» с соответствующей сигнатурой для класса «one_session».

1 Ответ

0 голосов
/ 12 октября 2018

После этого бита:

[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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...