2012-11-14 26 views
5

Tôi có một tệp có tên là histShape.m với chức năng histShape và một số chức năng khác.Làm thế nào tôi có thể khai báo một biến toàn cầu trong Matlab cho một vài chức năng?

Một cái nhìn tổng quát của mã này là:

% 
function [outputImage] = histShape(srcimg, destimg) 

    PIXELS = 255 + 1; 

    .... 
    .... 
end 



% 
function [outputImage] = normalizeAndAccumulate(inputImage) 

    PIXELS = 255 + 1; 

.... 
.... 

end 

% 
function [pixels] = getNormalizedHistogram(histogram , inputImage) 


    PIXELS = 255 + 1; 

    .... 
    .... 

end 

tôi có thể sử dụng global x y z; nhưng tôi đang tìm kiếm một cách khác nhau.

Tôi muốn khai báo biến số PIXELS là toàn cầu, làm cách nào tôi có thể làm điều đó?

Trân

+0

Thay vào đó, hãy chuyển biến phạm vi dưới dạng tham số hàm so với sử dụng toàn cục. Xem câu trả lời của tôi cho một ví dụ. – Dan

Trả lời

12

Bạn có thể truy cập vào một biến toàn cục bên trong một hàm MATLAB bằng cách sử dụng các từ khóa global:

function my_super_function(my_super_input) 
    global globalvar; 

    % ... use globalvar 
end 

Bạn thường sẽ khai báo biến toàn cầu trong một kịch bản bên ngoài chức năng sử dụng cùng một từ khóa:

% My super script 
global globalvar; 
globalvar = 'I am awesome because I am global'; 
my_super_function(a_nonglobal_input); 

Tuy nhiên, điều này là không cần thiết. Miễn là tên của biến toàn cầu là nhất quán giữa các hàm, bạn có thể chia sẻ cùng một biến bằng cách chỉ định định nghĩa global globalvar; trong bất kỳ hàm nào bạn viết.

Tất cả những gì bạn cần làm là xác định global PIXELS; ở đầu mỗi chức năng của bạn (trước khi bạn gán giá trị cho nó).

Xem tài liệu chính thức here.

+0

Vâng, nhưng biến toàn cầu không được chia sẻ với các chức năng khác, đó là vấn đề .. – ron

+2

Vâng, đó là .... nếu bạn sử dụng 'global' trong mỗi hàm cần chia sẻ. –

+0

@babydanks: Tôi hiểu, cảm ơn! +1 và được chọn! – ron

4

Một giải pháp thay thế cho việc sử dụng biến toàn cục không mong muốn chỉ là chuyển biến PIXELS của bạn cho mỗi hàm. Nếu bạn có nhiều thì bạn có thể tạo cấu trúc để giữ chúng.

% 
function [outputImage] = histShape(srcimg, destimg, PIXELS) 

    .... 
    .... 
end 



% 
function [outputImage] = normalizeAndAccumulate(inputImage, PIXELS) 

.... 
.... 

end 

% 
function [pixels] = getNormalizedHistogram(histogram , inputImage, PIXELS) 

    .... 
    .... 

end 

Hoặc với một struct

%In the main script calling the functions 
    options.Pixels = 255 + 1 

    function [outputImage] = histShape(srcimg, destimg, options) 

     PIXELS = options.Pixels; 
     .... 
     .... 
    end 
    %etc... 
1

Nếu lý do duy nhất cho việc sử dụng globals trong câu hỏi có liên quan đến mã được đăng, sau đó là giải pháp tốt nhất là sử dụng nested functions. Tất cả những gì bạn phải làm là di chuyển end đầu tiên của ví dụ của bạn xuống dưới cùng của tệp và bạn đã hoàn tất.

function [outputImage] = histShape(srcimg, destimg) 
PIXELS = 255 + 1; 

function [outputImage] = normalizeAndAccumulate(inputImage) 
    PIXELS = 255 + 1; 
end 

function [pixels] = getNormalizedHistogram(histogram , inputImage) 
    PIXELS = 255 + 1; 
end 
end 

không bao giờ sử dụng biến toàn cầu nếu bạn có thể tránh được.

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