Matlab 为什么这个高斯函数会给出不一致的参数误差?
输出1Matlab 为什么这个高斯函数会给出不一致的参数误差?,matlab,octave,Matlab,Octave,输出1 function m=gaussian(med, var, n) if ( mod(n, 2)==0 ) n=n+1; end; med=double(med); var=double(var); med = min (max(-(n+1)/2, med), (n+1)/2); m=zeros(1,n); k1=(1/(2*pi*var)^0.5); k2=-0.5.*((med-(1:n)).^2)./var; m(1,1:n
function m=gaussian(med, var, n)
if ( mod(n, 2)==0 )
n=n+1;
end;
med=double(med);
var=double(var);
med = min (max(-(n+1)/2, med), (n+1)/2);
m=zeros(1,n);
k1=(1/(2*pi*var)^0.5);
k2=-0.5.*((med-(1:n)).^2)./var;
m(1,1:n)=k1.*exp(k2);
输出2
>> gaussian([101 2 ; 3 4], [4 301 ; 2 1], [2 2])
error: gaussian: operator /: nonconformant arguments (op1 is 1x1, op2 is 2x2)
error: called from
gaussian at line 13 column 5
>>
我不确定您希望得到的结果是什么,但您得到了这个错误,因为您正在通过
[2x2]
矩阵对标量([1x1]
维度)执行操作。注意,您正在进行矩阵除法(/
运算符),而不是元素对元素的除法(/
运算符)
但是,这并不是唯一的问题,因为以下行对于减号运算符也有类似的问题:
octave:1> function m=gaussian(med, var, n)
> if ( mod(n, 2)==0 )
> n=n+1;
> end;
>
> med=double(med);
> var=double(var);
>
> med = min (max(-(n+1)/2, med), (n+1)/2);
>
> m=zeros(1,n);
>
> k1=(1/(2*pi*var)^0.5);
> k2=-0.5.*((med-(1:n)).^2)./var;
>
> m(1,1:n)=k1.*exp(k2);
> endfunction
octave:2> debug_on_error (1)
octave:3> gaussian ([101 2 ; 3 4], [4 301 ; 2 1], 2)
error: gaussian: operator /: nonconformant arguments (op1 is 1x1, op2 is 2x2)
error: called from
gaussian at line 13 column 5
stopped in gaussian at line 13
13: k1=(1/(2*pi*var)^0.5);
debug> (2*pi*var)
ans =
25.1327 1891.2388
12.5664 6.2832
debug> 1/(2*pi*var) # matrix division
error: gaussian: operator /: nonconformant arguments (op1 is 1x1, op2 is 2x2)
error: called from
gaussian at line 13 column 5
debug> 1./(2*pi*var) # your element by element division works
ans =
0.03978874 0.00052875
0.07957747 0.15915494
或者,可能函数没有错误,您得到这些错误是因为您错误地调用了函数。非常确定该函数是为第三个参数(
n
)设计的,它是标量,而不是向量。@BenVoigt,scanar n给出了相同的错误。问题已编辑。输出将是一个向量,而不是一个矩阵。。。。所以它不会对联合分布进行抽样。可能这三个参数都必须是标量。看起来Matlab函数mvnrd
可能就是您要寻找的。实际上,看起来这个函数是为单变量高斯函数编写的。
octave:1> function m=gaussian(med, var, n)
> if ( mod(n, 2)==0 )
> n=n+1;
> end;
>
> med=double(med);
> var=double(var);
>
> med = min (max(-(n+1)/2, med), (n+1)/2);
>
> m=zeros(1,n);
>
> k1=(1/(2*pi*var)^0.5);
> k2=-0.5.*((med-(1:n)).^2)./var;
>
> m(1,1:n)=k1.*exp(k2);
> endfunction
octave:2> debug_on_error (1)
octave:3> gaussian ([101 2 ; 3 4], [4 301 ; 2 1], 2)
error: gaussian: operator /: nonconformant arguments (op1 is 1x1, op2 is 2x2)
error: called from
gaussian at line 13 column 5
stopped in gaussian at line 13
13: k1=(1/(2*pi*var)^0.5);
debug> (2*pi*var)
ans =
25.1327 1891.2388
12.5664 6.2832
debug> 1/(2*pi*var) # matrix division
error: gaussian: operator /: nonconformant arguments (op1 is 1x1, op2 is 2x2)
error: called from
gaussian at line 13 column 5
debug> 1./(2*pi*var) # your element by element division works
ans =
0.03978874 0.00052875
0.07957747 0.15915494
error: gaussian: operator -: nonconformant arguments (op1 is 2x2, op2 is 1x3)
error: called from
gaussian at line 14 column 5
stopped in gaussian at line 14
14: k2=-0.5.*((med-(1:n)).^2)./var;