วันจันทร์ที่ 3 มกราคม พ.ศ. 2554

Matlab คำสั่ง eval (คำสั่งเทพจริงๆ)

ในการที่โหลดจำนวนข้อมูลจากภายนอกเข้ามา เช่นในการ import file มาสักชุดหนึ่ง ที่มีสัก 20-30 ไฟล์แล้วเรียงไล่เป็น series นั้น ถ้าเกิดเอาวิธีทึกๆ ก็ไล่ใส่คำสั่งทีละบรรทัด 20-30 ไฟล์ก็ยังพอไหวอยู่แค่ copy paste แต่มันก็จะทำให้ m-file ของเราดูยาวเสียสะจริงๆ แล้วถ้าเกิดสัก 100-200 ไฟล์หละ m-file ของเราก็แค่ยาวมากกกกกกกก แก้ยาวมากด้วยเช่นกัน

ปัญหาเหล่านั้นจะหมดไปเมื่อเรารู้จักคำสั่ง "eval()" ตอนไปนั่งอ่าน help ดูก็งงๆ เหมือนกันแปลไม่ค่อยภาษาอังกฤษไม่ค่อยจะแข็งแรง แต่พอดูตัวอย่างก็พอกล่อมแกล้มใช้งานได้





คำสั่ง eval ตามความเข้าใจของผมก็คือ เป็นคำสั่งที่ใช้ซ้อนคำสั่ง (โอ้ยแบบนี้งงงงงงง 555+) ผมพูดไม่ผิดครับคำสั่งซ้อนคำสั่งจริงๆ คือมันมีความสามารถที่จะแตกบรรทัดคำสั่งนั้นโดยเพิ่มลูกเล่นบางอย่างเข้าไปได้   อธิบายแบบนี้ก็คงงงๆ ดูตัวอย่างเลยดีกว่า

โดยผมมีโจทย์อยู่ว่า ผมจะรัน series ชื่อไฟล์โหลดเข้าไปใน series ของตัวแปรที่ต้องการ

เช่น
ผมมีไฟล์
xSeries1.xlsx
xSeries2.xlsx
xSeries3.xlsx
xSeries4.xlsx
xSeries5.xlsx

แล้วต้องการใส่ในตัวแปร mSeries1 ไปจนถึง mSeries5

วิธีบ้านๆ เลยก็คือใช้
mSeries1=xlsread('xSeries1.xlsx');
mSeries2=xlsread('xSeries2.xlsx');
mSeries3=xlsread('xSeries3.xlsx');
mSeries4=xlsread('xSeries4.xlsx');
mSeries5=xlsread('xSeries5.xlsx');
ดูๆ แล้วก็ไม่ได้ยาก และไม่ได้ยาวจนเกินไป

แล้วลองจินตนาการดูสิว่าถ้าเกิดมีสัก 100 ไฟล์หละ หุหุ ยาวเป็นวาเลย


งั้นลองมาดูตัวช่วยของเรากัน คือ eval

for n=1:5
     eval(['mSeries',int2str(n),'=xlsread(''xSeries''',int2str(n),'.xlsx)'])
end

เหลือแค่ 3 บรรทัดเอง ง่ายม่ะ  ทีนี้ถ้าเกิดมี 100 ไฟล์ ก็ใช้แค่ 3 บรรทัด
แต่งงอะดิว่า ใส่ไรเข้าไปมั่ง

มาดูวิธีการใส่เป็นขั้นตอนกันหลงทางดีกว่า

ตอนแรกเรามี
mSeries1=xlsread('xSeries1.xlsx');




ใส่คำสั่่ง eval(['']) ก่อนเลย ได้เป็น
eval(['mSeries1=xlsread('xSeries1.xlsx');'])




ทีนี้ตรงไหนที่มี '  ใส่เพิ่มไปอีกตัวเลย เป็น ''  ก็จะได้
eval(['mSeries1=xlsread(''xSeries1.xlsx'');'])


ต่อมาใส่ ลูปเลยก็จะได้
for n=1:5
     eval(['mSeries1=xlsread(''xSeries1.xlsx'');'])
end


ตรงนี้เป็นเทคนิคกันหลงของผมเอง ตรงไหนที่จะให้มันหมุนวนผมจะใส่ ', ,' คั่นรอไว้ก่อน ไม่งั้น มันจะลายตามากๆ แล้วก็ตามด้วย ตัวแปรที่จะหมุน ก็จะใส่ประมาณนี้ ',ตัวแปรที่หมุน,' โดยข้อแม้ของ eval มันจะต้องเป็น str ทั้งบรรทัด ถ้าเกิดเอาตัวแปร n มาหมุนเลย มันจะหมุนไม่ได้ ต้องแปลงเป็น str ก่อนโดยใช้คำสั่ง int2str ก็จะได้เป็น

for n=1:5
     eval(['mSeries',int2str(n),'=xlsread(''xSeries',int2str(n),'.xlsx'');'])
end



เป็นอันเสร็จสิ้นกระบวนการ 




ตรงนี้สามารถดัดแปลงได้เพียบ เช่นเอา array มาหมุนบ้าง เอาตำแหน่งไฟล์มาหมุนบ้าง

ไม่มีความคิดเห็น:

แสดงความคิดเห็น