5

Vì vậy, gần đây tôi đã chuyển đổi từ Mathematica sang Matlab, và trong khi Matlab có hầu hết các tính năng hữu ích của Mathematica, tôi không thể tìm ra cách thực hiện tương đương với hoạt động thiết lập bị trì hoãn của Mathematica ': ='. trong một thời trang lười biếng.Bạn có thể thực hiện một bộ trì hoãn (: = trong Mathematica) trong Matlab không?

Ví dụ, trong Mathematica:

y = 2;

x: = y;

y = 3;

x

sẽ cung cấp cho các giá trị của x là 3, trong khi cách duy nhất tôi có thể nhận được hành vi này cùng trong Matlab là:

y = 2;

x = @() (y);

y = 3;

x()

đó, trong khi về mặt kỹ thuật trả lời câu hỏi của tôi, là một tác phẩm quảng cáo hoc khá xung quanh và đòi hỏi điều trị x là một hàm.

Vì vậy, có cách tự nhiên hơn để làm điều này là Matlab?

EDIT:

giải pháp ad-hoc của tôi chỉ hoạt động khi y là một lĩnh vực của một lớp xử lý, tôi rời này ra khỏi các mã cho rõ ràng (nó phải được someclass.y). Tốt nhất là câu trả lời cho câu hỏi của tôi sẽ không có hạn chế này, nhưng tôi vẫn chấp nhận nó nếu nó đã làm.

Trả lời

5

Lazy evaluation chủ yếu được sử dụng trong các ngôn ngữ lập trình chức năng và MATLAB i s thủ tục/OOP dựa. Như vậy, tương đương với SetDelayed không tồn tại. Nếu bạn cố gắng sử dụng các hàm ẩn danh như bạn đã chứng minh, nó sẽ không hoạt động, như Amro đã chỉ ra.

Tuy nhiên, nếu bạn có quyền truy cập vào hộp công cụ tính toán biểu tượng, bạn có thể nhận được bằng thứ gì đó có thể được coi là tương đương := (tương đương mỏng manh, nếu bạn hỏi tôi). Dưới đây là một ví dụ:

syms x y z; %#Declare x, y and z as symbolic variables 
x=y+2; %#Define some value for x 
[email protected](x)x.^2; %#Define an anonymous function. 

f(x) 

ans = 

(y + 2)^2 

%#Check with z 
f(z) 

ans = 

z^2 

Bạn có thể thấy rằng nó sử dụng các định nghĩa thực tế của f, và không nắm bắt được định nghĩa của x như nó đã làm trong ví dụ số của bạn. Bạn cũng có thể thay đổi định nghĩa của x để nói, x=1/yf(x) giờ đây sẽ sử dụng định nghĩa hiện tại là x. Lưu ý rằng f chỉ đơn thuần là một hàm xử lý và sẽ lấy các đối số dạng số/ký hiệu. Ví dụ:

f(1:5) 

ans = 

    1  4  9 16 25 

Phần nơi nó không giống := là nó áp dụng các định nghĩa chỉ cho các điều khoản có mặt trong biểu thức và không đi sâu hơn (ví dụ, nó không đánh giá các định nghĩa cho sự khác nhau thiết lập các biến có thể phát sinh do kết quả đánh giá đầu tiên). Đây không phải là một bất ngờ vì MATLAB không phải là ngôn ngữ dựa trên quy tắc. Để minh họa cho quan điểm của tôi:

y=z^3; %#Define y 
f(x) 

ans = 
(y + 2)^2 %#The definition for y is not used. 

trong khi Mathematica sẽ cho bạn (z^3+2)^2.

Clear[y, z, x, f] 
f[x_] := x^2; 
y := z^3; x := y + 2; 

f[x] 

Out[1]= (2 + z^3)^2 

Tốt nhất là nếu bạn chấp nhận sự khác biệt trong hai ngôn ngữ và cố gắng gắn bó với những gì là thành ngữ trong mỗi. Việc cố gắng từ chối nó và chương trình giống như một chương trình khác có thể làm cho cuộc sống của bạn trở nên khốn khổ (ví dụ, bắt đầu bằng nền tảng C và viết một cách khéo léo For vòng lặp trong Mathematica).

3

Thực ra giải pháp đề xuất của bạn không hoạt động như mong đợi:

y = 2; 
x = @()(y); 
y = 3; 
x() 

khi bạn xác định các chức năng ẩn danh, nó tạo ra một đóng cửa và chụp/bản sao giá trị của y vào lúc đó (bây giờ nó có riêng của mình bản sao của y). Sau đó, nếu bạn thay đổi y ở bên ngoài, nó sẽ không ảnh hưởng đến cái được tạo trong phần đóng, do đó trong ví dụ của bạn giá trị cuối cùng sẽ trả lại 2 không 3

Cách duy nhất tôi có thể nghĩ là gói gọn biến một đóng và phơi bày các phương thức thiết lập/nhận (giống như trong OOP)

IMO, MATLAB và Mathematica có hai ngôn ngữ rất khác nhau, vì vậy tôi sẽ theo cách MATLAB và không thử mô phỏng các tính năng của các ngôn ngữ khác (thường không điều tốt nhất để làm)

+0

cảm ơn bạn đã nắm bắt, tôi đã chỉnh sửa bài đăng của mình để giải thích. Tuy nhiên, điều này thực sự là một nhận xét về câu hỏi của tôi chứ không phải là câu trả lời, vì bạn chưa cố gắng cung cấp câu trả lời ... Ngoài ra, trong khi tôi nhận ra Mathematica và Matlab ban đầu là các ngôn ngữ khác nhau (biểu tượng và tính toán số), họ đã bắt đầu chồng lên nhau theo những cách không tầm thường. Cả hai cũng cho phép lập trình trong các mô hình khác nhau, do đó, thực sự không còn là một 'MATLAB-way' nữa. – zergylord

+0

@zergylord: sự thật là tôi bắt đầu nó như một bình luận, nhưng đã trở thành quá dài cho một. Tôi sẽ xóa nó nếu bạn cảm thấy điều này không thêm bất kỳ giá trị: ( – Amro

+0

Ah có, giới hạn ký tự ác. Nvm sau đó, bạn không nên xóa nó vì nó là thông tin :). – zergylord

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