我有一个内置的类,想为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”找到具有匹配签名的方法“减号”。
答案 0 :(得分:0)
在此之后:
[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
)时不必要的复制。