Bạn có thể sử dụng định nghĩa của CacheIndex Tôi đã đăng trong What is in your Mathematica tool bag?. Một điều tốt về việc sử dụng hàm này là bạn có thể lưu các giá trị hoặc các phần mã mà không cần phải định nghĩa một hàm mới (mặc dù chúng ta làm ở đây để phù hợp với ví dụ).
G[x_,a_] :=
CacheIndex[a,
Pause[3];
Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]
][x];
Tôi đã thêm Pause [3] để làm rõ rằng định nghĩa của Nội suy được lưu trong bộ nhớ cache cho mỗi sau khi tính được một lần.
Sau đó, bạn có thể xóa các giá trị nội suy cache trong CacheIndex sử dụng
DeleteCachedValues[CacheIndex] (*or*)
DeleteCachedValues[CacheIndex,1].
tôi thích nghi chức năng Cache và CacheIndex của tôi để cho phù hợp với ý tưởng của WReach của việc sử dụng một biểu tượng riêng biệt định nghĩa trong một khối. Một điều không thực tế ở đây là bạn phải định nghĩa các thuộc tính Giữ cho biểu tượng được sử dụng làm bộ nhớ đệm, nhưng ý tưởng vẫn thú vị.
Dưới đây là định nghĩa của CacheSymbol
SetAttributes[CacheSymbol,HoldAll];
CacheSymbol[cacheSymbol_,expr_]:=cacheSymbol[expr]/.(_cacheSymbol:>(cacheSymbol[expr]=expr));
Bạn có thể kiểm tra điều này thực hiện bằng cách sử dụng hướng dẫn sau đây, trong một ví dụ bộ nhớ cache sản sẽ được định nghĩa trong một khối.
ClearAll[cache]
SetAttributes[cache,HoldFirst]
CacheSymbol[cache,Pause[3];2+2]
?cache
CacheSymbol[cache,Pause[3];2+2]
Dưới đây là định nghĩa của CacheSymbolIndex
SetAttributes[CacheIndexSymbol,HoldAll];
CacheIndexSymbol[cacheSymbol_,index_,expr_]:=cacheSymbol[index,expr]/.(_cacheSymbol:>(cacheSymbol[index,expr]=expr));
Bạn có thể kiểm tra điều này thực hiện bằng cách sử dụng hướng dẫn sau đây, trong một ví dụ bộ nhớ cache sản sẽ được định nghĩa trong một khối.
ClearAll[cache]
SetAttributes[cache,HoldRest]
CacheIndexSymbol[cache,2+2,Pause[3];2+2]
?cache
CacheIndexSymbol[cache,2+2,Pause[3];2+2]
và tương tự như ví dụ của WReach chúng ta sẽ phải
G[x_,a_] :=
CacheIndexSymbol[cache,a,
Print["Caching"];
Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]
][x]
Block[{cache},
SetAttributes[cache,HoldRest];
Table[G[x, a], {x, 0, 5}, {a, 0, 1, 0.1}]
]
Cách tiếp cận này có vẻ là phương pháp đơn giản nhất so với các phương pháp khác được cung cấp. Có thể có một rút lại cho lược đồ này qua bộ nhớ đệm rõ ràng như được mô tả trong các câu trả lời khác. Nhưng tôi không đủ chuyên gia để biết sự khác biệt. – mark
Các câu trả lời khác đối phó với cách phát hành bộ nhớ được lưu trữ trong biểu tượng bộ nhớ cache khi nó phát triển quá lớn. Ý tưởng bộ nhớ đệm của chúng giống như trong câu trả lời này. Nếu mã của bạn không phải là quá nhiều bộ nhớ, bạn có thể không quan tâm đến việc giải phóng bộ nhớ của phiên hiện tại, nhưng nó có thể hữu ích nếu bạn tính toán lớn. – faysou
@Faysal Aberkane ... Cảm ơn – mark