string文字列コピーの使用
C++要件:
文字列を入力し、文字列に基づいて選択配列を決定し、次のプロシージャに使用します.
MatLabコード:
(1).ファイルcalLaws.m
(2).ファイルavgsmth.m
(3).C++コード実装:Stringオブジェクトで実装
このセグメントコードは入力指定文字列(大文字)を実現し,文字列に基づいて指定した配列を用いて左右に乗算し,必要なボリュームコアを得る.
文字列を入力し、文字列に基づいて選択配列を決定し、次のプロシージャに使用します.
MatLabコード:
(1).ファイルcalLaws.m
function [y,h_v,h_h]=calLaws(x,id,LocalEnergy)
for dim=1:2
if dim==1
FilterId=upper(id(1:2)); % Input argument "id" is undefined.
else
FilterId=upper(id(3:4));
end
if strcmp(FilterId,'L5'), h(dim,1:5)=[ 1 4 6 4 1];
elseif strcmp(FilterId,'E5'), h(dim,1:5)=[-1 -2 0 2 1];
elseif strcmp(FilterId,'S5'), h(dim,1:5)=[-1 0 2 0 -1];
elseif strcmp(FilterId,'W5'), h(dim,1:5)=[-1 2 0 -2 1];
elseif strcmp(FilterId,'R5'), h(dim,1:5)=[ 1 -4 6 -4 1];
elseif strcmp(FilterId,'__'), h(dim,1:5)=[ 0 0 1 0 0];
end
end
h_v=h(1,:);
h_h=h(2,:);
y=filter2(h_v,filter2(h_h,x));
if exist('LocalEnergy')==1
y=avgsmth(abs(y),LocalEnergy);%LocalEnergyz !
end
(2).ファイルavgsmth.m
function y=avgsmth(x,M,N)
if nargin<3,% 3
N=M;
end
w=ones(M,1)/M;
y=filter2(w,x);
w=ones(1,N)/N;
y=filter2(w,y);
(3).C++コード実装:Stringオブジェクトで実装
void CGrayCal::calLaws(string id1,string id2)
{
int numL,numR;
int i,j;
int k;
int KerNum;
i=0;
j=0;
k=0;
numL=id1.size();
numR=id2.size();
char FilterL[5];
char FilterR[5];
strcpy(FilterL,id1.c_str());
strcpy(FilterR,id2.c_str());*/
// ,
KerNum =numL*numR;
ConvKer=new ConvKernel[KerNum];// , , 5*5
int L5[] = { 1 , 4, 6 , 4 , 1};
int E5[] = {-1, -2 , 0 , 2 , 1};
int S5[] = {-1 , 0, 2, 0, -1};
int W5[] = {-1 , 2 , 0 ,-2 , 1};
int R5[] = { 1, -4, 6 ,-4, 1};
int __[] = { 0 , 0 , 1 , 0, 0}; //(all pass)
int TempL[5];
int TempR[5];
for(i=0;i<numL;++i){
for(j=0;j<numR;++j){
if ( id1.substr(i,1)=="L")// !!!
memcpy(TempL,L5,sizeof(int)*5);
if ( id1.substr(i,1)=="E")
memcpy(TempL,E5,sizeof(int)*5);
if ( id1.substr(i,1)=="S")
memcpy(TempL,S5,sizeof(int)*5);
if ( id1.substr(i,1)=="W")
memcpy(TempL,W5,sizeof(int)*5);
if ( id1.substr(i,1)=="R")
memcpy(TempL,R5,sizeof(int)*5);
if ( id2.substr(i,1)=="L")
memcpy(TempR,L5,sizeof(int)*5);
if ( id2.substr(i,1)=="E")
memcpy(TempR,E5,sizeof(int)*5);
if ( id2.substr(i,1)=="S")
memcpy(TempR,S5,sizeof(int)*5);
if ( id2.substr(i,1)=="W")
memcpy(TempR,W5,sizeof(int)*5);
if ( id2.substr(i,1)=="R")
memcpy(TempR,R5,sizeof(int)*5);
memcpy(ConvKer[k].vector1,TempL,sizeof(int)*5);
memcpy(ConvKer[k].vector2,TempR,sizeof(int)*5);
vectorPlus(TempL,TempR,ConvKer[k].ConvMat);
++k;
}
}
このセグメントコードは入力指定文字列(大文字)を実現し,文字列に基づいて指定した配列を用いて左右に乗算し,必要なボリュームコアを得る.