【问题标题】:Operator overloading for array of elements元素数组的运算符重载
【发布时间】:2018-10-12 15:15:03
【问题描述】:

我已经构建了一个类,并希望为minus 添加运算符重载。 我编写了代码,如果我只输入一个元素,它就可以正常工作,但是我编写的函数应该适用于多个元素。

当我尝试输入一个数组(array of elements)-(one element) 时,它应该从arr 的每个元素中“减去”def 并返回一个新的元素数组。

这是代码:

  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”找到具有匹配签名的方法“减号”。

【问题讨论】:

  • 对不起,我在下面的回答没有解决您收到的错误消息。当我第一次阅读您的问题时,我没有注意到这一点。从您提供的代码中无法判断为什么会出现此错误。您能否请edit 您的问题包括minus 函数在类定义中的位置?不要发布您的完整课程,只需发布​​重现此错误所需的最小课程定义。见minimal reproducible example
  • 感谢您的重播,我创建了一个类来重现问题并找到了解决方案。我已经将运算符重载函数放在静态方法中,虽然我把它放在那里的原因是因为它不起作用,一定是某个地方的错字。

标签: arrays matlab operator-overloading


【解决方案1】:

在这之后:

[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

永远不会运行。您正在从数组1:(1-1) == 1:0 = [] 中获取i。所以循环总是被跳过。

您可能希望len 具有输入向量的长度。您可以改用isvectorlength

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),或者假设您在代码中使用二维矩阵,any(size(obj_arr)==1)

接下来,确保循环遍历向量的所有元素:

for i=1:len

出于效率原因,您应该将函数定义为

function obj_arr = minus(obj_arr,filt)

这将允许 MATLAB 更好地优化对您的函数的某些调用,避免在原地工作时不必要的复制(即arr=arr-1)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2016-08-30
    • 1970-01-01
    • 2011-09-18
    • 2010-10-21
    相关资源
    最近更新 更多