การสร้าง Array ด้วย Subscripts และ Superscripts

Oct 04 2020

ฉันต้องการหาวิธีสร้างอาร์เรย์โดยใช้ตัวห้อยและตัวยกตามข้อมูลต่อไปนี้:

Cs = {1, 3, 5};
Ss = {1, -1, 1};
Rules = {1 -> "+", -1 -> "-"};
Ss1 = Ss /. Rules;

ตัวอย่างเช่นถ้าฉันลอง:

{SubsuperscriptBox["c", Cs[[1]], Ss1[[1]]], 
  SubsuperscriptBox["c", Cs[[2]], Ss1[[2]]], 
  SubsuperscriptBox["c", Cs[[3]], Ss1[[3]]]} // DisplayForm

ฉันได้รับผลลัพธ์ของ:

$\{c^{+}_1,c^{-}_3,c^{+}_5\}$

นี่คือสิ่งที่ฉันต้องการจะได้รับ อย่างไรก็ตามฉันต้องการทำสิ่งนี้โดยอัตโนมัติมากกว่าการเข้ารหัสแบบยากเหมือนที่ฉันเพิ่งทำ ฉันหมายความว่าฉันควรจะสามารถเปลี่ยนอาร์เรย์ Cs และ Ss เป็นบางอย่างได้ตามอำเภอใจ ตัวอย่างเช่นพูดว่าฉันมีแทน:

 Cs = {1, 2, 4, 5};
 Ss = {1, -1, 1, -1};
 Rules = {1 -> "+", -1 -> "-"};
 Ss1 = Ss /. Rules;

จากนั้นฉันควรจะได้รับ:

$\{c^{+}_1,c^{-}_2,c^{+}_4,c^{-}_5\}$

แน่นอนฉันสามารถเปลี่ยนรหัสบล็อกที่สองได้ แต่ฉันต้องการดูว่ามีวิธีการทำเช่นนี้ที่สะอาดกว่านี้หรือไม่โดยที่ฉันไม่จำเป็นต้องเปลี่ยนด้วยตนเอง

คำตอบ

4 HenrikSchumacher Oct 04 2020 at 15:15

คุณสามารถใช้เช่น

MapThread[
 SubsuperscriptBox["c", ##] &,
 {Cs, Ss1}
 ]
4 kglr Oct 04 2020 at 16:22
Cs = {1, 2, 4, 5};
Ss = {1, -1, 1, -1};
Ss1 = Ss /. {1 -> "+", -1 -> "-"};

Thread[Subsuperscript["c", Cs, Ss1]]

คุณยังสามารถApply (@@@)ใช้ฟังก์ชันSubsuperscript["c", ##]&เพื่อจับคู่ค่าจากCsและSs1(นั่นคือถึงTranspose[{Cs, Ss1}}]):

Subsuperscript["c", ##] & @@@ Transpose[{Cs, Ss1}]