ÕªÒª£ºÍ¨¹ýÔËÓÃMatlabÓëVCµÄÓïÑÔºÍƽ̨ÌØÐÔ,½â¾öÁ˶þάÊý×é²ÎÊýµÄ´«µÝÓëÊä³ö;½éÉÜÁ½ÖÖMatlabͼÏñǶÈëVC½çÃæµÄ·½·¨,²¢ÒÔÖ÷³É·Ö·ÖÎöΪʵÀý,½²½âÁËÏà¹Øϸ½ÚÓëÄѵ㡣ͬʱ,½éÉÜÁËÒ»ÖÖ¸ü¼ÓÁé»î¡¢¼ò±ãµÄ¶ÁÈ¡ExcelÎļþµÄ·½·¨¡£
»ùÓÚCOM×é¼þµÄMatlabÓëC++»ìºÏ±à³Ì·½Ê½ÒòÓµÓжÀÁ¢µÄÔËÐл·¾³ºÍÁ½ÖÖÓïÑԵĻ¥²¹ÓÅÊƶø±»ÖÚ¶à¿ÆÑÐÈËÔ±ºÍ±à³ÌÈËÔ±Ëù½ÓÊÜ£¬Í¬Ê±Ò²ÊÇMathWorks¹«Ë¾ÍƼöʹÓõĻì±à·½Ê½¡£µ«ÔÚ³ÌÐòÉè¼Æ¹ý³ÌÖУ¬Í¨³£»áÓöµ½Á½¸öÄѵãÎÊÌ⣺(1)¶þάÊý×é²ÎÊýµÄ´«µÝÓëÊä³ö; (2)MatlabÉú³ÉͼÐÎǶÈëVC¹¤³Ì½çÃæÖС£¶ÔÓÚµÚÒ»¸öÎÊÌâ,Bruce McKinney[1]ÔÚMSDNÉÏÖ¸³ö£»“Èç¹û¶ÔһάÊý×é½øÐвÙ×÷£¬ÔòSAFEARRAYº¯Êý±äµÄ¼òµ¥ÇÒÒײÙ×÷¡£µ«ÊǶÔÓÚ¶àάÊý×飬ͬÑùµÄ²Ù×÷Òª¸´ÔÓµÃ¶à”£¬Ôì³ÉÕâÒ»ÎÊÌâµÄ¸ùÔ´ÔÚÓÚMatlabÓëC++¶Ô¶àάÊý×éÔªËصĴ洢·½Ê½²»Í¬¡£¶øÔÚ±¾ÏîÄ¿¿ª·¢¹ý³ÌÖлرÜÁËÕâ¸ö¸´ÔӵĹý³Ì£¬×ª¶øÀûÓÃMatlabÇ¿´óµÄÊý×é´¦Àí¹¦Äܽ«Æä½â¾ö¡£MatlabÍêÉƵÄͼÐδ¦Àí¹¦ÄÜÊÇÆä±»¿ÆÑÐÈËÔ±ËùÍƳçµÄÔÒòÖ®Ò»£¬µ«ÒòÆäͼÐÎÓµÓжÀÁ¢µÄ´°¿Ú£¬ÑÏÖØÓ°ÏìÁËÕûÌå½çÃæÃÀ¹ÛºÍÓû§½»»¥ÌåÑ飬ËùÒÔMatlabͼÐÎǶÈëÊÇ»ìºÏ±à³ÌÖв»¿É»Ø±ÜµÄÎÊÌâ¡£¶Ô´Ë½«Í¨¹ýʵÀý½éÉÜÁ½ÖÖͼÐÎǶÈë·½·¨²¢·ÖÎö˵Ã÷ÆäÓÅȱµãºÍÏà¹Øϸ½Ú¡£
±¾ÎÄʾÀý¾ùÔÚMatlab R2008aºÍVC 6.0ƽ̨ÏÂÍê³É£¬ÇÒͨ¹ýµ÷ÊÔÄܹ»Õý³£ÔËÐС£
1 ExcelÎļþ¶ÁÈ¡·½·¨
VCƽ̨ϵÄExcelÎļþ¶ÁÈ¡·½Ê½¸´ÔÓÄѶ®£¬µ«Èç¹ûʹÓÃMatlabÓëVCµÄ»ìºÏ±à³Ì·½Ê½±àд½«¸ü¼Ó¼ò±ã£¬¶øÇÒÓµÓнÏÇ¿µÄ¿ÉÀ©Õ¹ÐÔ¡£ÏÂÃæ´úÂëÏêϸ½²½âÁ˸ùý³Ì¡£
(1)ÔÚMatlabƽ̨Ͻ¨Á¢CExcelRead.mÎļþ£¬´úÂëÈçÏ£º
function [output£¬row£¬col] = CExcelRead(filePath)
//filePath°üº¬ÁËÖ¸¶¨ÎļþµÄ·¾¶ºÍÎļþÃû£¬ÓÉVCƽ̨º¯ÊýGetPathName()»ñÈ¡
[typ, desc] = xlsfinfo(filePath);
//xlsfinfo()¿É»ñÈ¡Ö¸¶¨ExcelÎļþÖи÷¸ösheet¹¤×÷ÇøµÄÃû³Æ£¬·µ»ØÖµ´æÈëÃûΪdescµÄcellÊý×éÖÐ
sheet1 = cell2mat(desc(1));
//ĬÈÏ´ò¿ª”sheet1”(Ãû³ÆÈÎÒâ)£¬²¢½«Æäת»»Îª×Ö·û´®
output = xlsread(filePath,sheet1);
//·µ»Ø¸ÃExcelÎļþÖеÄÊý¾Ý,·µ»ØÖµ´æÈëoutputÊý×éÖÐ
[row,col] = size(output);
//»ñȡ¼ÈëÊý¾ÝµÄÐÐÁÐÖµ£¬·µ»Øµ½VCƽ̨ÒÔ¹©Æ俽±´Ö¸¶¨ÄÚ´æ´óСµÄÊý¾Ý
output = reshape(output,row*col,1);
//½«¸Ã¶þάÊý×éת»»ÎªÒ»Î¬¡£ÕâÊǵڶþ²¿·Ö¶þάÊý×é´¦ÀíµÄµÚÒ»²½
±£´æÎļþºó£¬Ê¹ÓÃdeploytool¹¤¾ß½«ÆäÖÆ×÷³ÉÃûΪFileOpenµÄCOM(·â×°MCR)£¬×¢²á¸Ã¿Ø¼þ²¢½«ÏàÓ¦µÄÎļþ¿½±´µ½MFCµÄ¹¤³ÌÖУ¬¶ÔÓÚ»ù´¡²Ù×÷´Ë´¦²»ÔÙ׸Êö¡£
(2)ÔÚVCƽ̨Ï´´½¨ÃûΪPCAµÄ»ùÓÚ¶Ô»°¿òµÄMFC¹¤³Ì,Ìí¼ÓÒ»´ò¿ªÎļþµÄ°´Å¥¿Ø¼þ,IDΪID_FILE_OPEN¡£Æª·ùËùÏÞÖ»¸ø³ö²¿·ÖºËÐÄ´úÂ룬Ê×ÏÈÔÚDlgÀàÖÐÌí¼Ó3¸ö˽ÓгÉÔ±±äÁ¿ÓÃÒÔ±£´æMatlab¶ÁÈ¡µÄÊý¾Ý¼°ÐÐÁÐÖµ£¬¼´:
double *m_originData; long m_row, m_col;
ÔÚÏìÓ¦º¯ÊýÖÐÌí¼ÓÈçÏ´úÂë
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle="ÇëÑ¡ÔñÄãµÄexcelÊý¾Ý";
fileDlg.m_ofn.lpstrFilter="Text Files(*.xls)*.xlsAll Files(*.*)*.*";
if(IDOK==fileDlg.DoModal() {
CString fileName; IFileOpenclass *pfile;
VARIANT filePath,output,rowOutput,colOutput;
//mÎļþµÄÊäÈë²ÎÊý
fileName = fileDlg.GetPathName();
//»ñÈ¡Îļþ·¾¶²¢´æÓÚfileNameÖÐ
CoInitialize(NULL); //COM³õʼ»¯
HRESULT hr = CoCreateInstance(CLSID_FileOpenclass,NULL,CLSCTX_ALL,IID_IFileOpenclass,(void**)&pfile);
//н¨COMʵÀý
VariantInit(&filePath); //VARIANTÊý¾Ý³õʼ»¯
filePath.vt = VT_BSTR; //Ö¸¶¨filePath±äÁ¿ÀàÐÍ
//½«fileNameÖб£´æµÄÖ¸¶¨Îļþ·¾¶Ãû±£´æÖÁfilePath²ÎÊýÖÐ
filePath.bstrVal = fileName.AllocSysString();
pfile->CExcelRead(3,&output,&rowOutput, &colOutput,filePath);
m_row=(long) rowOutput.dblVal;
//È¡³öÐÐÁÐÖµ¼°Â¼ÈëÊý¾Ý
m_col = (long) colOutput.dblVal;
m_originData = (double *)malloc(sizeof(double)*m_row*m_
col)£» memcpy(m_originData,output.parray->pvData,m_row*m_
col*sizeof(double));
//½«matlab¶ÁÈëÊý¾Ý±£´æµ½m_originData¹©ºóÃæ³ÌÐòʹÓÃ
} ÉÏÊöC++´úÂëÖÐÊ¡ÂÔÁËÒì³£´¦ÀíºÍÏà¹ØµÄÄÚ´æ¡¢COMÊÍ·Å´úÂ룬ÓÉÓÚ´úÂë±È½Ï¼òµ¥ËùÒÔ²»×ö½øÒ»²½½âÎö¡£Çë×¢Ò⣬ÏÂÃ潫ʡÂÔCOM³õʼ»¯¼°ÊµÀý»¯µÈÏàͬ´úÂë¡£
(3) ÐèÒªÖصã˵Ã÷µÄÊǸ÷½·¨µÄÀ©Õ¹ÐÔ¡£Í¨³£ExcelÎļþÖб£´æ¶à¸ö¹¤×÷Çø£¬ÓÐʱÓû§¿ÉÄÜÐèÒª´ò¿ªÍ¬Ò»ExcelÎļþÖв»Í¬¹¤×÷ÇøÖеÄÊý¾Ý£¬³£¹æ·½·¨ÊµÏÖ¹ýÓÚ¸´ÔÓ£¬µ«¶ÔÓÚ±¾ÎĽéÉܵķ½·¨¿ÉÒÔͨ¹ýÐÞ¸ÄÌí¼Ó¼¸ÌõÓï¾ä¼´¿ÉʵÏÖ¡£Ê×ÏÈ£¬Ð½¨Ò»¸ömÎļþÓÃÀ´´¦Àí¹¤×÷ÇøµÄÑ¡Ôñ£¬´úÂëÈçÏÂ:
function [sheet,col] = CSheetSelected(filePath)
[typ, sheet] = xlsfinfo(filePath);
[row,col] = size(sheet);
ÓÉÓÚ·µ»ØÖµÊÇÒ»¸öcellÊý×飬ËùÒÔVCƽ̨ҪʹÓÃCStringArrayÊý¾Ý½á¹¹±£´æ·µ»ØÖµ£¬²¢ÏÔʾ¸÷¹¤×÷ÇøÃû³Æ¹©Óû§Ñ¡Ôñ¡£È»ºó£¬Í¨¹ýÈË»ú½»»¥½«Óû§Ñ¡ÔñµÄ¹¤×÷Çø²ÎÊý±£´æ²¢´«µÝÖÁCExcelRead.m£¬Í¨¹ýÔÚCExcelRead.mÔö¼ÓÒ»¸ö¹¤×÷ÇøÑ¡Ôñ²ÎÊý£¬²¢¶Ô´úÂëÉÔ×÷Ð޸ļ´¿É¡£
2 ¶þάÊý×é²ÎÊýµÄ´«µÝÓëÊä³ö[2]
ÏÂÃæÒÔÖ÷³É·Ö·ÖÎöΪÀý½éÉÜ»ùÓÚCOMµÄMatlabÓëVC»ìºÏ±à³ÌÖжþάÊý×é²ÎÊý´¦Àí¡£
(1) Ö÷³É·Ö·ÖÎöpcamat.m´úÂëÈçÏÂ:
function [eigenvector,eigenvalue] = pcamat(oriData,row,column)
//ÔÚExcel¶ÁÈëʱÒѾÍê³ÉÁ˶þάÊý×éÊä³öµÄ¹Ø¼ü²½Ö裬¼´Êä³öʱ½«¶þάÊý×éת»»ÎªÒ»Î¬Êý×é¡£µ«ÔÚVCƽ̨½ÓÊÕ»¹ÔΪ¶þάʱҪעÒ⣬MatlabÊý×é´æ´¢·½Ê½ÊÇ°´Áд洢£¬¶øVCƽ̨ÏÂÊý×éÊÇ°´Ðд洢£¬ËùÒÔת»»Ê±0~row-1ΪµÚÒ»ÁУ¬row~2*row-1ΪµÚ¶þÁУ¬ÒÔ´ËÀàÍÆ¡£±¾ÎÄÊäÈë²ÎÊýoriDataÊÇһάÊý×飬ËùÒÔÒª½«Æ仹ÔΪ¶þάÊý×éʹMatlab³ÌÐòÄܹ»Õý³£ÔËÐУ¬¼´ÏÂÒ»ÐдúÂëËùʾ¡£
oriData = reshape(oriData,row,column);
dataSTD=std(oriData,0,1); dataMean = mean(oriData);
dataSR = (oriData-dataMean(ones(row,1),:))./dataSTD(ones(row,1),:);
[eigenvector,newdata,eigenvalue,Exa]=princomp(dataSR);
//µÚÈýÐÐÖÁ´Ë´¦¾ùΪÖ÷³É·Ö·ÖÎöÄÚÈÝ
eigenvector = reshape(eigenvector,column*column,1);
//ÓëExcelÎļþ¶ÁȡʱÀàËÆ£¬½«¶þάÊä³öת»»ÎªÒ»Î¬Êý×é½øÐÐÊä³ö
(2) ±£´æºó£¬·â×°´ò°üΪCOM×é¼þ£¬²¢Íê³É×¢²áµÈÏà¹Ø²Ù×÷¡£ÔÚPCA¹¤³Ì¶Ô»°¿òÉÏÌí¼ÓÒ»¸öÃûΪPCATestµÄ°´Å¥¿Ø¼þ£¬ºËÐÄ´úÂëÈçÏÂ:
VARIANT oriData,row,column,eigVector,eigValue;
VariantInit(&oriData); //²ÎÊý³õʼ»¯
oriData.vt = VT_R8|VT_ARRAY;
//¶¨ÒåSAFEARRAYÀàÐ͵ÄһάÊý×é
SAFEARRAYBOUND rgsadound[1];
rgsadound[0].lLbound = 0;
rgsadound[0].cElements = m_row*m_col;
oriData.parray = SafeArrayCreate(VT_R8,1,rgsadound);
oriData.parray->pvData = m_originData;
//Íê³ÉÏà¹ØÉèÖú󣬽«µÚÒ»²½¶ÁÈëµÄÊý¾Ý¼Èëµ½oriDataÖУ¬¼´¸³¸øpcamatµÄoriData¡£µ½´ËÍê³ÉÁ˶þάÊý×éµÄ´«µÝ
row.vt = VT_I4; col.vt = VT_I4;
row.lVal = m_row; col.lVal = m_col;
pca->pcamat(2,&eigVector,&eigValue,oriData,row,col);
memcpy(result, eigVector.parray->pvData,m_col*m_col*
sizeof(double));
×ÛÉÏ£¬¶þάÊý×é²ÎÊý´¦Àí¾ÍÊÇʹÓÃreshape()º¯Êý¶ÔÊäÈëÊä³öÊý¾ÝάÊý½øÐб任À´Íê³É²Ù×÷¡£
3 MatlabͼÏñǶÈëVC½çÃæ[3]
3.1 »ùÓÚCWndÀàµÄͼÏñǶÈë
ÔÚWindows²Ù×÷ϵͳÏ£¬ËùÓÐÓ¦ÓóÌÐòµÄ´°¿Ú¶¼ÊÇ»ùÓÚMFCÖеÄCWndÀà¡£ËùÒÔ¿ÉÒÔͨ¹ýµ÷ÓøÃÀà»òÆäÅÉÉúÀàÖеķ½·¨ÊµÏÖͼÏñǶÈë¡£»ù±¾Ë¼Ï룺ÔÚMatlabƽ̨ÏÂÓÃCOM·â×°²úÉúͼÐδ°¿ÚµÄ³ÌÐò£»ÔÚVCƽ̨»ñÈ¡Figure´°¿ÚµÄ¾ä±ú£¬½«Figure´°¿ÚÉèΪVC³ÌÐòµÄ×Ó´°¿Ú£»(3)½«Figure´°¿ÚÒƶ¯µ½Ö¸¶¨ÏÔʾλÖá£
³ÌÐòʵÏÖÈçÏÂ:
(1)½«Ôpcamat.m½øÐÐÐÞ¸Ä,Ìí¼ÓÉú³ÉͼÏñµÄÏà¹Ø´úÂë
function [eigenvector,eigenvalue] = pcamat(oriData,row,column,picName)
//Ôö¼ÓpicName²ÎÊý£¬VCƽ̨ÏÂhFig½«Í¨¹ý¸ÃÃû³Æ»ñÈ¡Éú³ÉͼÏñµÄ¾ä±ú
figure('NumberTitle','Off','MenuBar','None','ToolBar','Figure','Name',picName,'Units','Points');
//ͼÏñ²ÎÊýÔ¤É裬±£Áô¹¤¾ßÀ¸¡£Ê¹ÓÃMatlabÌṩµÄ¹¤¾ßÀ¸µÄËùÓй¦ÄÜÊÇʹÓø÷½·¨µÄ×î´óÓŵã
percent = 100*eigenvalue /sum(eigenvalue)£»
//¼ÆËã¹±Ï×ÂÊ
pareto(percent)£» //»Í¼
xlabel('Ö÷³É·Ö')£»
ylabel('·½²îÕ¼µÄ±ÈÖØ(%)')£»
(2)·â×°´ò°ü³ÉÃûΪfigureµÄCOM×é¼þ£¬²¢Íê³É×¢²áµÈÏà¹Ø²Ù×÷¡£ÒòΪÐ޸ĺóµÄmÎļþÔËÐнá¹û°üº¬Êä³ö½á¹ûºÍͼÏñÁ½²¿·Ö£¬ËùÒÔÏÂÃæÓйØͼÏñ´¦ÀíµÄ´úÂëÒÀÈ»ÔÚPCATest¿Ø¼þµÄÏìÓ¦º¯ÊýÖС£
CString WNDName = "Demo"; //×Ô¶¨Òå´°¿ÚÃû³Æ
Ifigureclass *pic£»
VARIANT oriData, row, col, picName,eigVector, eigValue; VariantInit(&picName);
……
picName.vt = VT_BSTR; //½«×Ô¶¨Òå´°¿ÚÃû³Æ¸³Óè
MatlabÉú³ÉͼÏñ
picName.bstrVal = WNDName.AllocSysString();
HWND hFig; int timer = 50;
//ÓÃËÀÑ»·È·±£¿ÉÒÔ»ñÈ¡µ½Í¼Ïñ¾ä±ú£¬×¢Òâ´Ë´¦±ØÐëʹÓÃsleep(),¸øÓèϵͳ×ã¹»µÄÏìӦʱ¼ä
while(1){
pic->pcamat(2,&eigVector,&eigValue,oriData,row,col,
picName);
Sleep(timer);
hFig = ::FindWindow(NULL,FigName);
if(hFig != NULL){
break;
}
timer += 10;
pic->Release();
}
long lStyle = ::GetWindowLong(hFig,GWL_STYLE); //ÉèÖÃFigure´°¿ÚÑùʽ¡£
//×¢ÒâSetWindowLong()ºÍSetWindowPos()ÏȺó˳Ðò£¬Ïê¼ûMSDN
::SetWindowLong(hFig,GWL_STYLE,lStyle&(~WS_CAPTION)&(~WS_THICKFRAME))
::SetWindowPos(hFig,NULL,0,0,0,0,SWP_NOMOVE|SWP_
NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_
FRAMECHANGED);CRect PlotRec;
CWnd *PlotArea = GetDlgItem(IDC_STATIC_FIGURE); //ÉèÖÃͼÏñÏÔʾÇøÓò
PlotArea->GetWindowRect(&PlotRec);
long Width = PlotRec.right - PlotRec.left;
long Height = PlotRec.bottom - PlotRec.top;
::SetParent(hFig,PlotArea->GetSafeHwnd());
//ÉèÖÃͼÏñµÄ¸¸´°¿Ú
::SetWindowPos(hFig,NULL,0,0,Width,Height,SWP_NOZORDER|SWP_NOACTIVATE);
ÔËÐнá¹ûÈçͼ1Ëùʾ¡£¸Ã·½·¨µÄȱµãÊÇ£¬ÔÚͼÏñÉú³Éʱ»áÓÐÉÁ˸ÏÖÏ󡣶øÓŵãÊÇÇ°ÃæÌáµ½µÄ¿ÉÒÔ¼ÌÐøʹÓÃMatlabÌṩµÄ¹¤¾ßÀ¸¡£¼øÓÚ¸ÃȱµãÓ°ÏìÕûÌåÃÀ¹Û£¬ËùÒÔÒýÈëÏÂÃæµÚ¶þÖÖ·½·¨¡£
3.2»ùÓÚBitmapÀàµÄͼÏñǶÈë
ͨ¹ýBitmapÀཫMatlabÉú³ÉµÄ.bmpÎļþ¼ÓÔص½VC¹¤³ÌÖУ¬Ê¹ÓÃBitmapÀàÖеijÉÔ±º¯Êý¶ÔͼÏñ½øÐд¦Àí¡£ÓÉÓÚÏà¹Øº¯Êý¿ÉÒÔͨ¹ý°ïÖúÊÖ²á»ñÈ¡,ËùÒÔ´Ë´¦²»ÔÙ¸ø³öÏàÓ¦´úÂ룬ÔËÐнá¹ûÈçͼ2Ëùʾ¡£¸Ã·½·¨±ÜÃâÁË·½·¨Ò»Éú³ÉͼÏñʱµÄÉÁ˸ÏÖÏó,µ«ÊÇBMPͼÏñÏÔʾЧ¹û½Ï²î¶øÇÒÎÞ·¨Ê¹ÓÃMatlabÌṩµÄ¹¤¾ß²Ëµ¥,ÕâÊÇÆä²»×ãÖ®´¦¡£
ʹÓÃCOM×é¼þ½øÐлìºÏ±à³Ìʱ£¬ÍùÍùÏ°¹ßÓÚÔÚVCƽ̨ÏÂ˼¿¼ËùÓöµ½µÄÎÊÌ⣬µ«ÊÇÕâÑù²»½öʹµÃÎÊÌâ¿ÉÄܱäµÃ¸´ÔÓ»¯£¬»òµÃ²»µ½Í×Éƽâ¾ö£¬¶øÇÒҲΥ±³ÁË“»ìºÏ”µÄ³õÖÔ¡£¶þάÊý×é²ÎÊý´¦Àí¾ÍÊÇÒ»¸öºÜºÃµÄÀýÖ¤¡£Æä´Î£¬³ä·ÖÀûÓÃMatlabÌØÐÔ¿ÉÒÔʹµÃ³ÌÐò¾ß±¸Á¼ºÃµÄÀ©Õ¹ÐÔºÍÎȶ¨ÐÔ£¬¶ÔExcelÎļþ¶ÁÈ¡·½Ê½½øÐеÄÀ©Õ¹£¬Ã÷ÏÔʹÈí¼þ¸ü¼ÓÈËÐÔ»¯¡£¶ÔÓÚͼÏñǶÈëÎÊÌ⣬ËäÈ»ÎÄÖÐÌá³öµÄÁ½ÖÖǶÈ뷽ʽ¿ÉÒÔÂú×ã»ù±¾ÐèÇ󣬵«ÊÇÈÔÈ»´æÔÚһЩ覴㬻¹ÐèÒª½øÒ»²½Ñо¿¡£
²Î¿¼ÎÄÏ×
[1] MCKINNEY B. Article 5. The Safe OLE Way of Handling Arrays.MSDN, 2001.
[2] Áõά.¾«Í¨MatlabÓëC++»ìºÏ³ÌÐòÉè¼Æ(µÚ2°æ)[M].±±¾©£º±±¾©º½¿Õº½Ìì´óѧ³ö°æÉ磬2008.
[3] ¶Î¬¹ú.ÉîÈëdz³öMatlab 7.X»ìºÏ±à³Ì[M].±±¾©£º»úе¹¤Òµ³ö°æÉ磬2006.
×÷ÕߣºÍõά Áõ±ó Áø±þÀû κÓÑ»ª À´Ô´£º¡¶Î¢ÐÍ»úÓëÓ¦Óá·