0

私は matlab でクラスを宣言します。ここにコンストラクターと関数があります。

function Ri = RGBimages(datadir)
    if(isempty(dir(datadir)))
        warning([datadir, ' is empty']);
        return;
    end
    Ri.dataSrc=datadir;
    Ri.twoEnds = load([datadir,'\seIndex.txt']);
    Ri.startFrame = Ri.twoEnds(1);
    Ri.endFrame = Ri.twoEnds(2);
    Ri.numberOfFrames=Ri.twoEnds(2)-Ri.twoEnds(1)+1;
    Ri.faceLmks = zeros(68,2,Ri.numberOfFrames);
end

function obtainFaceLmks(Ri)
    indx=1;
    for i = Ri.startFrame;%:Ri.endFrame
        imstr = [Ri.dataSrc,'\rgb_',num2str(i),'.png'];
        [status,result] = system(['fitD -m src\my.amf -h src\haarcascade_frontalface_alt2.xml -i ',imstr,' -n 30']);
        if(status==-1)
            warning(result);
        else
            temp=flHelper(result(1:size(result,2)-59));
            Ri.faceLmks(:,:,indx)=temp;
        end
        indx=indx+1;
    end
    return;
end

それから私はこれをします:

ims = RGBimages('data\a01_s01_e01');

ims.obtainFaceLmks();

ims の属性 (ims.faceLmks) が変更されていないようですが、なぜですか?

助けてくれてありがとう

4

2 に答える 2

2

値クラスは値渡しです。したがって、メソッドは (更新された) クラス インスタンスを返す必要があり、それをキャプチャする必要があります。つまり、メソッド定義は

function Ri = obtainFaceLmks(Ri)

そして、あなたはメソッドを呼び出すでしょう

ims = ims.obtainFaceLmks();

ハンドル クラスは参照によって渡されます。したがって、メソッドは更新されたクラス インスタンスを返す必要はなく、それをキャプチャする必要もありません。ただし、から継承する必要がhandleあり、コピー メソッドを実装してクラス インスタンスのコピーを作成する必要があります。別の変数への割り当ては機能しません。

詳細については、ドキュメントを参照してください。

于 2012-07-04T00:12:01.220 に答える
0

このクラスは、独自の値を変更できるように継承する必要があります。それ以外の場合は、単なる「値クラス」であり、何かを返すことによってのみ値を変更できます。

于 2012-07-03T23:15:45.080 に答える