2012-10-04 11 views
7

Chciałem obliczyć standardowe wyprowadzenie elementów macierzy. Więc najpierw przekształciłem swoją macierz za pomocą polecenia reshape na wektor, a następnie użyłem std.Std Matlaba działa w REPL, ale nie w programie

Jednak mam komunikat o błędzie:

Error using var (line 59) 
First argument must be single or double. 

Error in std (line 32) 
y = sqrt(var(varargin{:})); 

Error in reducenoise2>standabw (line 112) 
      s = std(B); 

Error in reducenoise2 (line 36) 
D = standabw(n,m,r,fu,D); 

Więc drukowane mój wektor B, tuż przed przekazaniem go do std. Przypisałem go do zmiennej x w REPL, próbowałem ręcznie wywołać std(x).

Co ciekawe, działa to dobrze.

W jaki sposób funkcja std – wywoływana z tymi samymi argumentami powoduje, że w moim kodzie jest błąd, ale działa poprawnie w REPL?

Oto funkcja Matlab:

function [D] = standabw(n,m,r,fu,D) 
    for i = 1+r:n-r 
     for j = 1+r:m-r 
      C = D(i-r:i+r,j-r:j+r); 
      B = reshape(C,(2*r+1)^2,1) 
      s = std(B); 
      if s > fu 
       D(i,j) = 255; 
      end 
     end 
    end 
end 

Jest to wektor B, tuż przed komunikatem o błędzie:

B = 

    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    1 
    0 
    0 
    0 
    0 
    0 
    0 
    0 

Odpowiedz

6

Najprawdopodobniej B wektor ITS pewnego typu int. Spróbuj zadzwonić ten sposób

std(double(B)) 

Powyższe stwierdzenie pierwszy rzuca B do typu double, a następnie wywołuje std.

Aby sprawdzić, jaki typ zmiennych ma typ whos w wierszu polecenia.

+0

Wielkie dzięki! Teraz działa. Ale nadal nie rozumiem, dlaczego. Czy mógłbyś wytłumaczyć to? – milli

+0

Prosty: oczekuje się, że wejście podwójne. –

Powiązane problemy