string文字列コピーの使用

3253 ワード

C++要件:
文字列を入力し、文字列に基づいて選択配列を決定し、次のプロシージャに使用します.
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;
        }
    }

このセグメントコードは入力指定文字列(大文字)を実現し,文字列に基づいて指定した配列を用いて左右に乗算し,必要なボリュームコアを得る.