2012-10-04 21 views
7

Tôi muốn tính toán đạo hàm chuẩn của các phần tử của ma trận. Vì vậy, tôi lần đầu tiên chuyển ma trận của tôi bằng lệnh reshape thành một vectơ, và sau đó sử dụng std.Hoạt động của MATLAB trong REPL nhưng không có trong chương trình

Tuy nhiên, tôi nhận được một thông báo lỗi:

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); 

Vì vậy, tôi in vector của tôi B, ngay trước khi đi qua nó để std. Tôi đã gán nó cho một biến số x trong REPL đã thử gọi số std(x) theo cách thủ công.

Điều thú vị là điều này chỉ hoạt động tốt.

Vậy làm thế nào chức năng std – được gọi với cùng một đối số – dẫn đến lỗi khi được sử dụng trong mã của tôi, nhưng hoạt động tốt trong REPL?

Đây là Matlab chức năng:

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 

Đây là vector B, ngay trước khi thông báo lỗi:

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 

Trả lời

6

Nhiều khả năng B vector của bạn của một số kiểu int. Cố gắng gọi theo cách này

std(double(B)) 

Những tuyên bố trên đầu phôi B để loại tăng gấp đôi, và sau đó gọi std.

Để kiểm tra, loại biến số là gì whos tại dấu nhắc lệnh.

+0

Cảm ơn rất nhiều! Bây giờ nó hoạt động. Nhưng tôi vẫn không hiểu tại sao. Bạn có thể giải thích điều này không? – milli

+0

Đơn giản: nó hy vọng tăng gấp đôi như đầu vào. –

Các vấn đề liên quan