Thursday, April 26, 2012

Recall the last input parameters after exiting the program and set default input parameters

ผมพัฒนาโปรแกรมอยู่ตัวหนึ่งครับ การใช้งานผู้ใช้ต้องใส่ input parameter หลายค่าในหลายๆที่ด้วย ซึ่งอาจทำให้ผู้ใช้งานเหนื่อยใจกับเรื่องนี้ เช่น ถ้ารันโปรแกรมกับตัวอย่าง input parameter เหมือนเดิมแต่ต้องกลับมานั่งใส่ทีละตัวทุกครั้ง ผมเลยต้องพยายามหาแนวทางเพื่อแก้ปัญหานี้ อันนี้ถามจากผู้รู้จากเว็บไซต์นี้ครับ shadowwares (ขอชมว่าเป็นมืออาชีพครับสำหรับไซต์นี้)

ดังนั้นในครั้งนี้ผมนำเสนอ การเรียกข้อมูล input เก่า (ครั้งล่าสุดหลังจากปิดโปรแกรม) พร้อมด้วยการกำหนดค่า เริ่มต้นไว้ด้วย (default) โดยได้รับคำแนะนำจากไซต์ที่กล่าวข้างต้น ผมใช้คำสั่ง save และ load ครับ แต่ปัญหาการใช้ คำสั่ง load ก็คือเราต้องมีไฟล์โปรแกรมโหลดก่อนครับ ดังนั้นในที่นี้ผมจะจัดเตรียมไว้ด้วยครับ (ผมทำง่ายๆ คือ ตอนแรกอย่าพึ่งใช้คำสั่ง load สั่งให้ save ก่อน เราก็จะได้ไฟล์เพื่อโหลดละครับ)

ผมจึงจำลองการเขียนกราฟของสองฟังก์ชันขึ้นมา ได้แก่ sine and sinc functions (y=sin(x) and y=sin(x)/x) ผู้ใช้งานสามารถกำหนดค่า x จากการใส่ค่าเริ่มต้น ค่าสุดท้าย และ step size ของการเพิ่มค่า x นอกจากนี้ยังมีโหมดให้เลือกใช้ค่า default ที่โปรแกรมกำหนดมาให้ใช้ได้อีกด้วยในที่นี้กำหนดให้ x เริ่มตั้งแต่ -50 ถึง 50 โดยเพิ่มค่าทีละ 0.1 หรือ x=[-50 : 0.1 : 50]

การแก้ไข source code นั้นผมขอยกมาเฉพาะส่วนครับ รายละเอียดไปดูใน DefaultParameter.m เอา ผมสร้าง GUI ขึ้นมาและให้ชื่อว่า DefaultParameter.fig และไฟล์ที่เตรียมไว้ชื่อ parameters.mat

ปกติผมไม่ค่อยได้แก้ไขส่วนนี้ครับ แต่ถ้าเราจะจัดการให้โปรแกรมรู้จักค่าต่างๆ ตั้งแต่เปิดใช้งานต้องนำมาใส่ไว้ในส่วนนี้ครับ อธิบายประมาณนี้เลยครับ
- ก่อนอื่นโหลดไฟล์ที่เก็บ parameters ต่างๆมาก่อน (คำสั่ง load)
- กำหนดให้ edit text handles รับค่าที่โหลดมาไปใช้ (คำสั่ง set)
- รับค่าจาก  edit text handles มาไว้ใน handles ที่เราตั้งไว้ (คำสั่ง get)

% --- Executes just before DefaultParameter is made visible.
function DefaultParameter_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to DefaultParameter (see VARARGIN)
% Choose default command line output for DefaultParameter
handles.output = hObject;
%Load the last variable from file.mat
load parameters.mat;
%-------------------------------------------
set(handles.editInitial,'String',InitialValue);
set(handles.editFinal,'String',FinalValue);
set(handles.editStep,'String',StepSizeValue);
%-------------------------------------------
Initial_value=get(handles.editInitial,'string');
handles.InitialValue=Initial_value;
Final_value=get(handles.editFinal,'string');
handles.FinalValue=Final_value;
StepSize_value=get(handles.editStep,'string');
handles.StepSizeValue=StepSize_value;

%---set initial value for if condition in PlotOperate_Callback
handles.SincPlotCheck=0; % กำหนดค่าให้ก่อน ใช้กับปุ่มกด plot graph
handles.SinePlotCheck=0;
% Update handles structure
guidata(hObject, handles);

ส่วนนี้จะทำงานเมื่อกดปุ่ม default parameters โปรแกรมจะเรียกค่า defaults ที่กำหนดไว้มาให้ตัวแปร
นั่นคือในที่นี้ default ก็คือ x = [-50 : 0.1 : 50]

% --- Executes on button press in pushDefault.
function pushDefault_Callback(hObject, eventdata, handles)
% hObject    handle to pushDefault (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%set default parameters, when the default buttom was pressed
set(handles.editInitial,'String','-50');
set(handles.editFinal,'String','50');
set(handles.editStep,'String','0.1');
Initial_value=get(handles.editInitial,'string');
handles.InitialValue=Initial_value;
Final_value=get(handles.editFinal,'string');
handles.FinalValue=Final_value;
StepSize_value=get(handles.editStep,'string');
handles.StepSizeValue=StepSize_value;
guidata(hObject, handles);

ในส่วนนี้จะทำงาน โดยแสดงกราฟบน axes1 ได้แก่
การเขียนกราฟของ sine function และ sinc function (sinX/X)

% --- Executes on button press in PlotOperate.
function PlotOperate_Callback(hObject, eventdata, handles)
% hObject    handle to PlotOperate (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles.axes1;
Initial  = str2double(handles.InitialValue); %#ok<*ST2NM>
Final    = str2double(handles.FinalValue);
Stepsize = str2double(handles.StepSizeValue);
x        = [Initial : Stepsize : Final];
y=sin(x);
yy=sinc(x);%sin(x)./x;

if handles.SinePlotCheck==1
    plot(x,y);
elseif handles.SincPlotCheck==1
    plot(x,yy);
else
    plot(x,y,'g');hold on;
    plot(x,yy,'r');hold off;
end

guidata(hObject, handles);

%save structure handles in file.mat
save parameters.mat -struct handles; % คำสั่งบันทึกพารามิเตอร์ต่างๆก่อนปิดโปรแกรม

Tuesday, April 17, 2012

Principle of RGB image

ขอกลับมาที่ภาพสีอีกครั้งครับ หลังจากที่ทำงานกับ MATLAB อยู่หลายบทความ วันนี้มาลองช่วยกันดู หลักการพื้นฐาน ทฤษฎี คำอธิบาย เพื่อให้เราได้เข้าใจเกี่ยวกับ ที่มา-ที่ไป ของภาพสี (RBG image) และมองเห็นแนวทางการจัดการกับภาพเหล่านั้นได้ดังใจเราต้องการ

Monday, April 9, 2012

How to transfer data dynamically between GUIs?‎

ในหัวข้อนี้เป็นการแก้ไขและเพิ่มเติมความสามารถจากหัวข้อ uitable in GUI MATLAB นั่นคือผมยังใช้ไฟล์ก่อนหน้านี้อยู่ แต่สร้าง GUI ขึ้นมาเพิ่มอีกหนึ่งหน้าต่างครับ

ความสามารถของโปรแกรมนี้ที่ผมต้องการมีรายละเอียดดังนี้
- GUI หน้าหลักที่มีชื่อว่า sampleTable ให้อ่านข้อมูลตัวเลขที่ถูกเก็บไว้ในไฟล์ช
นิด text file (ในที่นี้คือ dat.txt) แล้วแสดงผลเป็นกราฟและแสดงผลข้อมูลดังกล่าวในตารางที่สร้างขึ้น
- ส่งค่าข้อมูลดังกล่าวออกไปยังอีก GUI หนึ่ง ในที่นี้ให้ชื่อว่า externalTable
- สามารถบันทึกข้อมูลเป็นไฟล์ Ms. Excel ด้วย

การแลกเปลี่ยนข้อมูลระหว่าง GUI อาศัยฟังก์ชัน (คำสั่ง) ดังต่อไปนี้
- setappdata ใช้สำหรับกำหนดให้ตัวแปร (ที่เก็บข้อมูลไว้) ถูกมอง
เห็นได้จาก GUI อื่นๆ
- getappdata ใช้สำหรับรับค่าจากตัวแปรที่กำหนดโดย setappdata

ภาพด้านล่างแสดง รูปร่างหน้าโปรแกรมที่สร้างจาก GUIDE ได้แก่ sampleTable.fig และ externalTable.fig



ส่วนภาพโปรแกรมเมื่อถูกสั่งให้ทำงาน แสดงดังภาพด้านล่าง

การเพิ่มเติม source code มีดังนี้
สำหรับไฟล์ sampleTable.m มีดังนี้ครับ

% --- Executes on button press in pushDisplayDATA.
function pushDisplayDATA_Callback(hObject, eventdata, handles)
% hObject handle to pushDisplayDATA (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.dataShow= handles.inputDATA(:,2:5);
set(handles.tableDATA, 'data',handles.dataShow)
% ----- เตรียม ข้อมูลไว้สำหรับ GUI อื่นๆ ------------
setappdata(0, 'test_data', handles.dataShow);
% ในที่นี้เก็บข้อมูล handles.dataShow ไว้ใน test_data

externalTable; % open externalTable GUI
guidata(hObject,handles);

% --- Executes on button press in push2Excel. ส่วนนี้
% จะบันทึกข้อมูลเป็น excel file
function push2Excel_Callback(hObject, eventdata, handles)
% hObject handle to push2Excel (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
data=handles.dataShow;
StandardConFileName = uiputfile('*.xls','Save as');
xlswrite(StandardConFileName,data);

สำหรับไฟล์ externalTable.m มีดังนี้ครับ

% --- Outputs from this function are returned to the command line.
function varargout = externalTable_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

Table_data=getappdata(0, 'test_data');%รับข้อมูลจาก sampleTable ซึ่งเก็บไว้ใน %test_data
% ----- ตรงไม่ต้องกังวลครับ เราจะจัดการข้อมูลยังไงก็ได้ ตามความต้องการเลยครับ -----
Table_data1=(Table_data(:,1))./max(Table_data(:,1));
Table_data2=(Table_data(:,2))./max(Table_data(:,2));
Table_data3=(Table_data(:,3))./max(Table_data(:,3));
Table_data4=(Table_data(:,4))./max(Table_data(:,4));
Table_data=[Table_data1 Table_data2 Table_data3 Table_data4];

% ------------ แสดงข้อมูลในตาราง externalTable --------------
set(handles.uitableAcceptDAT,'data',Table_data);

% ------- ให้สร้าง figure ขึ้นมาใหม่ สำหรับการเขียนกราฟข้อมูล -------
figure()
plot(Table_data1,'-*b');hold on
plot(Table_data2,'+r-');
plot(Table_data3,'--k');
plot(Table_data4,'-og');hold off
xlabel('index');ylabel('Normalized value');title('Test interface Multi-GUIs');
varargout{1} = handles.output;

download ไฟล์ทั้งหมดที่นี่  ===> download files

References

1. http://blogs.mathworks.com/videos/2005/10/03/guide-video-part-two/
2. http://www.mathworks.com/matlabcentral/answers/6831-updating-application-data-from-several-gui-s
3. http://stackoverflow.com/questions/5346635/how-to-pass-parameters-to-a-matlab-gui-file

Saturday, April 7, 2012

uitable in GUI MATLAB

วันนี้ผมขอนำเสนอ การใช้งาน uitable ใน GUIDE MATLAB เพื่อสร้างตารางมารองรับข้อมูลบางอย่างที่ต้องแสดงผลเป็นแบบตาราง

ดังนั้นตัวอย่างนี้ ผมสร้างโปรแกรมเพื่ออ่านข้อมูล ที่เก็บไว้เป็นไฟล์ text ที่มีชื่อว่า dat.txt แล้วนำมาแสดงเป็นกราฟ โดยผู้ใช้เลือกกดปุ่ม Display graph และแสดงข้อมูลดังกล่าวในตารางด้วย เมื่อผู้ใช้กดปุ่ม Display Data ในโปรแกรมนี้ยังสร้างปุ่มกดเพื่อ clear data ที่แสดงอยู่ในกราฟและตาราง ออกไม่ให้ผู้ใช้เห็นกราฟและข้อมูล ในตัวอย่างนี้ผมจะเน้น การแสดงกราฟและข้อมูลในตารางเป็นหลักครับ

ภาพด้านล่างนี้ เป็นตัวอย่าง layout ของโปรแกรมและโปรแกรมที่พร้อมทำงานครับ ส่วนไฟล์ต่างๆ เข้าไปเอาในนี้ได้เลยครับ >>> uitable


ส่วนภาพนี้เป็นหน้าตาโปรแกรม ที่กำลังทำงานอยู่ครับ



ส่วน source code ที่ต้องเพิ่มเข้าไปในไฟล์ แสดงดังด้านล่างครับ ผมยกมาเฉพาะส่วน open file, การเขียนกราฟ และ การส่งข้อมูลไปแสดงบนตารางที่เราสร้างขึ้นเท่านั้น

%--- ส่วนการ import file into matlab และจัดเก็บใน structure handle ---
% --- Executes on button press in pushImportDATA.

function pushImportDATA_Callback(hObject, eventdata, handles)
% hObject handle to pushImportDATA (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[F,PathName,FilterIndex] = uigetfile({'*.*','All Files(*.*)'}, 'Select your File ');
guidata(hObject,handles);
b=strcat(PathName,F);
input=importdata(b);
handles.inputDATA=input; % เก็บข้อมูลที่โหลดเข้ามาไปเก็บไว้ที่ inputDATA
%แต่ต้องเก็บใน handle
guidata(hObject,handles);

%--------- แสดงข้อมูลในรูปแบบกราฟ -------------
% --- Executes on button press in pushPlotGraph.
function pushPlotGraph_Callback(hObject, eventdata, handles)
% hObject handle to pushPlotGraph (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.showGraph); % บอกให้ GUI ทราบว่า จะแสดงกราฟใน axes ไหน
%ในที่นี้ตั้งชื่อ(tag) เป็น showGraph
plot(handles.inputDATA(:,1),handles.inputDATA(:,2),'-*b');hold on
plot(handles.inputDATA(:,1),handles.inputDATA(:,3),'+r-');
plot(handles.inputDATA(:,1),handles.inputDATA(:,4),'--k');
plot(handles.inputDATA(:,1),handles.inputDATA(:,5),'-og');hold off
guidata(hObject,handles);

% ------- ส่วน ส่งข้อมูลไปแสดงในตาราง --------------
% --- Executes on button press in pushDisplayDATA.
function pushDisplayDATA_Callback(hObject, eventdata, handles)
% hObject handle to pushDisplayDATA (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
dataShow= handles.inputDATA(:,2:5);
set(handles.tableDATA, 'data', dataShow)
guidata(hObject,handles);

% --- ส่วนการ ยกเลิกหรือลบการแสดงผล ในกราฟและตาราง ----
% --- Executes on button press in pushCLEAR.
function pushCLEAR_Callback(hObject, eventdata, handles)
% hObject handle to pushCLEAR (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
cla(handles.showGraph,'reset') % clear current data on axes หมายถึง ลบการแสดงผลในกราฟ
set(handles.tableDATA,'Data',[]) % clear current data in table