9

Làm việc trên một nhiệm vụ liên quan đến thuật toán di truyền (tải các cơn đau đầu, vô số niềm vui). Tôi cần để có thể kiểm tra các phương pháp chéo khác nhau và các phương pháp đột biến khác nhau, để so sánh kết quả của chúng (một phần của bài báo tôi phải viết cho khóa học). Như vậy, tôi muốn chỉ chuyển các tên hàm vào phương thức Repopulate, như là các hàm xử lý.MATLAB- chuyển một tham số xử lý chức năng vào một hàm khác làm xử lý

function newpop = Repopulate(population, crossOverMethod, mutationMethod) 
    ... 
    child = crossOverMethod(parent1, parent2, @mutationMethod); 
    ... 

function child = crossOverMethod(parent1, parent2, mutationMethod) 
    ... 
    if (mutateThisChild == true) 
    child = mutationMethod(child); 
    end 
    ... 

Điểm then chốt ở đây giống như 3, tham số 3: làm cách nào để chuyển đột biếnMethod xuống một cấp độ khác? Nếu tôi sử dụng biểu tượng @, tôi được thông báo:

"mutationMethod" was previously used as a variable, 
conflicting with its use here as the name of a function or command. 

Nếu tôi không sử dụng ký hiệu @, thì đột biếnMã được gọi, không có tham số và hoàn toàn không hài lòng.

Trong khi tôi biết rằng có, tôi chỉ có thể viết lại mã của mình để làm cho nó hoạt động khác nhau, bây giờ tôi tò mò về cách làm cho nó thực sự hoạt động.

Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

13

Thực ra chỉ không sử dụng biểu tượng @, sử dụng nó khi bạn gọi hàm Repopulate thay thế. Ví dụ:

function x = fun1(a,m) 
    x = fun2(a,m); 
end 

function y = fun2(b,n) 
    y = n(b); 
end 

mà chúng ta gọi là:

> fun1([1 2 3], @sum) 
6 

Tham khảo tài liệu cho Passing Function Handle Arguments


Lưu ý bạn có thể kiểm tra nếu đối số là một chức năng xử lý theo: isa(m,'function_handle'). Vì vậy, bạn có thể làm cho chức năng của bạn repopulate linh hoạt hơn bằng cách chấp nhận cả hai chức năng xử lý và một tên hàm như là một chuỗi:

function x = fun(a,m) 
    if ischar(m) 
     f = str2func(m); 
    elseif isa(m,'function_handle') 
     f = m; 
    else 
     error('expecting a function') 
    end 
    x = fun2(a,f); 
end 

mà bây giờ có thể được gọi là cả hai cách:

fun1([1 2 3], @sum) 
fun1([1 2 3], 'sum') 
Các vấn đề liên quan