2012-02-09 34 views
12

Tôi đã cài đặt một thư viện có một số chức năng có cùng tên với MATLAB. Và bằng cách cài đặt lib, tôi có nghĩa là addpath. Khi tôi cố gắng gọi những hàm đó, nó sẽ sử dụng thực thi của lib đó nhưng tôi muốn gọi thực thi MATLAB.Có thể gọi một hàm không nằm trong đường dẫn trong MATLAB không?

Để làm cho nó đơn giản hơn: làm cách nào tôi có thể chỉ định chức năng nào cần gọi khi tôi có địa chỉ tuyệt đối của cả hai hàm?

Tôi đã tìm kiếm câu trả lời nhưng tôi không tìm thấy câu trả lời trên trang web.

+1

Thư viện lớn đến mức nào và bạn sẽ làm việc với nó bao nhiêu? Bạn muốn gọi các chức năng của nó từ mã của bạn bao lâu một lần? Có mã OO trong thư viện không? –

Trả lời

10

Nếu bạn quá tải bất kỳ hàm tích hợp MATLAB nào để xử lý một lớp cụ thể, thì MATLAB luôn gọi hàm quá tải trên loại đó. Nếu vì lý do nào đó, bạn cần gọi phiên bản tích hợp, bạn có thể ghi đè cơ chế gọi thông thường bằng chức năng dựng sẵn. Biểu thức

builtin('reshape', arg1, arg2, ..., argN); 

bắt buộc cuộc gọi đến hàm MATLAB tích hợp sẵn, chuyển đổi các đối số được hiển thị mặc dù quá tải tồn tại cho lớp trong danh sách đối số này.

http://www.mathworks.com/help/techdoc/matlab_prog/br65lhj-1.html

8

sử dụng run, nó sẽ cho phép bạn sử dụng chức năng riêng của bạn thay vì được xây dựng-in mà không thêm chúng vào con đường.

Taken từ sự giúp đỡ:

Chạy kịch bản đó không phải là trên con đường hiện tại Cú pháp

chạy Tập lệnh

Như @Cheery nói một cách chính xác, nó có thể không được sử dụng cho các chức năng chấp nhận lập luận. Tuy nhiên, run.m là tệp có thể sửa đổi, vì vậy tôi đã tạo phiên bản mở rộng, có thể chấp nhận đối số. Nó có thể được sửa đổi cho các đối số đầu ra cũng khá dễ dàng.

function runExtended(script,varargin) 

    cur = cd; 

    if isempty(script), return, end 
    if ispc, script(script=='/')='\'; end 
    [p,s,ext] = fileparts(script); 
    if ~isempty(p), 
     if exist(p,'dir'), 
      cd(p) 
      w = which(s); 
      if ~isempty(w), 
       % Check to make sure everything matches 
       [wp,ws,wext] = fileparts(w); 
       % Allow users to choose the .m file and run a .p 
       if strcmp(wext,'.p') && strcmp(ext,'.m'), 
        wext = '.m'; 
       end 

       if ispc 
        cont = ~strcmpi(wp,pwd) | ~strcmpi(ws,s) | ... 
         (~isempty(ext) & ~strcmpi(wext,ext)); 
       else 
        cont = ~isequal(wp,pwd) | ~isequal(ws,s) | ... 
         (~isempty(ext) & ~isequal(wext,ext)); 
       end 
       if cont 
        if exist([s ext],'file') 
         cd(cur) 
         rehash; 
         error('MATLAB:run:CannotExecute','Can''t run %s.',[s ext]); 
        else 
         cd(cur) 
         rehash; 
         error('MATLAB:run:FileNotFound','Can''t find %s.',[s ext]); 
        end 
       end 
       try 
        feval(s,varargin{:}); 
        %   evalin('caller', [s ';']); 
       catch e 
        cd(cur); 
        rethrow(e); 
       end 
      else 
       cd(cur) 
       rehash; 
       error('MATLAB:run:FileNotFound','%s not found.',script) 
      end 
      cd(cur) 
      rehash; 
     else 
      error('MATLAB:run:FileNotFound','%s not found.',script) 
     end 
    else 
     if exist(script,'file') 
      evalin('caller',[script ';']); 
     else 
      error('MATLAB:run:FileNotFound','%s not found.',script) 
     end 
    end 

end 
+1

là dành cho SCRIPTS, không dành cho các chức năng! bạn đã thử à? bạn sẽ không thể cung cấp các đối số hàm theo cách này. và kết quả của cuộc gọi này cho tệp chức năng sẽ giống như thế này '??? Đối số đầu vào "x" là không xác định.' trong đó "x" là đối số của hàm. – Cheery

+0

Tất nhiên. Hãy thử điều này - chức năng tập tin 'function y = myfunc (x) (dòng mới là ở đây) y = x; disp (y); 'lưu nó thành' myfunc.m' ở đâu đó và thử 'run path/myfunc.m' trong dòng lệnh của Matlab. Kết quả sẽ là '??? Đối số đầu vào "x" là không xác định. "Matlab có hai loại tệp - cho các hàm và cho các tập lệnh. Bạn không thể chạy tệp chức năng trực tiếp từ trình chỉnh sửa hoặc dòng lệnh. Tệp chức năng phải nằm trong đường dẫn và Matlab sẽ cố định vị trí tệp đó theo chính nó tại cuộc gọi. – Cheery

+0

@Cheery, cập nhật xong :) cảm ơn một lần nữa. –

2

Một giải pháp khác cho câu hỏi của bạn mà tôi thích khi tôi gọi nhiều chức năng được tích hợp liên tiếp là tạm thời chuyển thư viện của tôi sang cuối đường dẫn.

libpath = '/home/user/mylib'; 
% move mylib to the end of the path 
addpath(libpath, '-end'); 
% now call some built-in functions that mylib overwrites 
reshape(rand(100),10,10); 
% return mylib to the top 
addpath(libpath) 

Tất nhiên nếu bạn sử dụng chức năng được tích hợp thường xuyên hơn thư viện của mình, bạn có thể giữ thư viện ở cuối đường dẫn và di chuyển thư viện lên đầu bất cứ khi nào bạn sử dụng. Tuy nhiên, hãy cẩn thận về thư mục hiện tại của bạn, nó sẽ luôn luôn mất precedence qua thứ tự đường dẫn.

1

câu trả lời của Andrey là không lý tưởng đối với tôi, nhưng nó và đề nghị Loren để "cd vào thư mục, tạo chức năng xử lý của bạn, và sau đó cd trở lại" khiến tôi suy nghĩ những điều sau đây:

Xác định một hàm những gì Loren mô tả:

function functionHandle = getFunctionHandleFromFile(fullFileName) 

[pathstr, name, ext] = fileparts(fullFileName); 

prevDir = pwd; 

cd(pathstr); 
functionHandle = str2func(name); 
cd(prevDir); 

Sau đó, bạn chỉ có thể sử dụng để có được tay cầm. Với tay cầm, bạn có thể gọi hàm:

nameOf = getFunctionHandleFromFile('/Users/sage/matlab-utilities/nameOf.m') 
nameOf(output) 

Lưu ý cho người dùng MATLAB mới hơn: Tôi khuyên bạn nên thận trọng với cách tiếp cận này!Nó có thể rất hữu ích trong một số trường hợp, nhưng nói chung tôi sẽ tự hỏi bản thân mình nếu không có cách nào tốt hơn để đối phó với vấn đề bạn đang cố giải quyết. Điều này có thể tạo ra nhiều đau đầu hơn giải quyết.

+0

Vấn đề là khi chức năng muốn đọc/ghi một tập tin từ/đến thư mục làm việc hiện tại, ngắt phương thức của bạn. –

+0

Xem thêm câu hỏi liên quan http://stackoverflow.com/questions/13072470/call-a-function-that-is-not-on-the-matlab-path-without-adding-that-path/22532918#22532918 và FEX Đóng góp: http://www.mathworks.com/matlabcentral/fileexchange/45941-constructor-for-functionhandles –

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