Overbar as counter in a loop
Tôi muốn tạo một bảng có bốn quầy khác nhau mà tôi muốn gọi $a, \bar{a}, b, \bar{b}$. Vì vậy, mã rõ ràng của tôi là
$$\text{Table}\left[p\left[a,\bar{a},b,\bar{b}\right],\{a,0,1\},\left\{\bar{a},0,1\right\},\{b,0,1\},\left\{\bar{b},0,1\right\}\right] // \text{Grid}$$
cái nào trả về
{{p[0,0,0,0],p[0,1,0,1]},{p[0,1,1,0],p[0,1,1,1]}} {{p[0,0,0,0],p[0,1,0,1]},{p[0,1,1,0],p[0,1,1,1]}}
{{p[1,0,0,0],p[1,0,0,1]},{p[1,0,1,0],p[1,1,1,1]}} {{p[1,1,0,0],p[1,1,0,1]},{p[1,0,1,0],p[1,1,1,1]}}
Tuy nhiên, nhìn nhanh cho thấy rằng đây không phải là kết quả mong đợi - các phần tử trong hàng đầu tiên được lặp lại. Nếu tôi viết
Table[p[a, c, b, d] , {a, 0, 1}, {c, 0, 1}, {b, 0, 1}, {d, 0, 1}] // Grid
thay vào đó tôi nhận được đầu ra mong muốn. Vì vậy, câu hỏi của tôi là gấp đôi:
- Tại sao nó xảy ra?
- Làm thế nào nó có thể được cố định? Đó là, tôi có thể sử dụng các biến như$\bar{a}$ hoặc là $a'$ hoặc là $a_1$ cho các vòng lặp sửa đổi một cái gì đó hoặc tôi buộc phải sử dụng các tên khác không liên quan đến các ký hiệu này?
Trả lời
Bạn có thể cung cấp cho OverBarcác HoldFirstthuộc tính để nó không phụ thuộc vào giá trị của a:
SetAttributes[OverBar,HoldFirst]
Sau đó:
t1 = Table[
p[a, OverBar[a], b, OverBar[b]],
{a, 0, 1}, {OverBar[a], 0, 1}, {b, 0, 1}, {OverBar[b], 0, 1}
];
t2 = Table[p[a, c, b, d], {a, 0, 1}, {c, 0, 1}, {b, 0, 1}, {d, 0, 1}];
t1 === t2
Thật
Vấn đề là Mathematica xử lý OverBarnhư một hàm, vì vậy OverBar[a]một hàm biểu tượng của bạn cũng vậy a, không phải là một biểu tượng độc lập.
Tôi sẽ tránh sử dụng các ký hiệu như vậy, nhưng nếu hình thức bên ngoài quan trọng với bạn, hãy điều tra Symbolizechức năng của Notationgói.