1

ボタン (SAVE) を押すと、システムがいくつかのフィールドの値を取得し、特定の関数を計算し、結果をデータ構造に保存する単純な GUI を作成しました。このデータ構造をプログラムの外部に置きたいと思います。つまり、Matlab の終了時に残り、プログラムを次に開いたときに、このデータ構造が利用可能でアップグレード可能でなければなりません。

これを行うためにdata、必要に応じて保存およびロードするグローバル変数を使用しました。

問題は、それが適切に機能しないdataことです。構造が奇妙に満たされています。

おそらくもっとわかりやすいgifをお見せします: ここに画像の説明を入力

保存された構造は次のとおりです。 ここに画像の説明を入力

ご覧のとおり、要素のリストではなく、他の中に構造があります。なんで?

datan 個の要素 (n は画像の数) を含み、各要素が 9 つのフィールド ( namecategorysiftOctavessiftLevelssiftPeaksiftEdge、)numFeaturesで構成される構造を持ちたいと考えています。siftFeaturessiftDescriptors

これはコードの一部です:

%% SAVE BUTTON
function pushSiftSave_Callback(hObject, eventdata, handles)
    % hObject    handle to pushSiftSave (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    global data;

    try
        % Vector of string = name of all possible images 
        imgs = createListOfImages('../img/');
        % Get selected image
        imgName = get(handles.listbox, 'Value');
        imgPath = strcat('../img/', imgs(imgName));
        imgPath = imgPath{1};
        I_or = imread(imgPath);
        I = single(rgb2gray(I_or));

        % Get some parameters enter by user
        [siftOctaves, siftLevels, siftPeak, siftEdge] = takeSiftParameters(handles.editSiftOctaves, handles.editSiftLevels, handles.editSiftPeakTh, handles.editSiftEdgeTh, I_or);  

        % Sift function
        [f, d] = vl_sift(I, 'Octaves', siftOctaves, 'Levels', siftLevels, 'PeakThresh', siftPeak, 'EdgeThresh', siftEdge);

        % Number of features
        perm = randperm(size(f, 2));
        numFeatures = size(perm, 2);

        % Check if file exists
        if exist('../data/data.mat', 'file') == 2 
            data = load('../data/data');
        else
            data = struct;
        end
        % Insert information in data structure
        data = saveSiftInformation(data, imgs, imgPath, siftOctaves, siftLevels, siftPeak, siftEdge, f, d, numFeatures);

    catch
        ErrorMessage = lasterr;
        msgbox(ErrorMessage);
        disp(ErrorMessage);
    end



function [data] = saveSiftInformation(data, imgs, imgPath, siftOctaves, siftLevels, siftPeak, siftEdge, features, descriptors, numFeatures)
    imgPath = imgPath(8 : end);

    % Find index of image
    i = find((ismember(imgs, imgPath)));

    % Update data structure
    data(i).name = imgPath;
    data(i).category = imgPath(1 : end-6);
    data(i).siftOctaves = siftOctaves;
    data(i).siftLevels = siftLevels;
    data(i).siftPeak = siftPeak;
    data(i).siftEdge = siftEdge;
    data(i).numFeatures = numFeatures;
    data(i).siftFeatures = features;
    data(i).siftDescriptors = descriptors;

    % Save data 
    save('../data/data', 'data');
end


%% SAVE & QUIT BUTTON.
function pushQuit_Callback(hObject, eventdata, handles)
    % hObject    handle to pushQuit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    global data;
    assignin('base', 'data', data);

ありがとう!

4

2 に答える 2

1

ファイルをロードすると、直面している問題が生成されdata.matます。

また、dataによって返される変数の名前として使用すると、load混乱が生じる原因となります。

命令

data = load('../data/data')

を読み取り、data.matそこに含まれる「データ」を という名前の構造体に格納するdataため、構造体は実際には によって返されるfiled構造体のです。dataload

load呼び出しの直後にブレークポイントを設定し、変数を調べることでテストできますdata

dataファイルをロードするときに構造体からフィールドを抽出することで問題を解決でき.matます。

if(exist('data.mat', 'file') == 2)
%    data = load('data');
   tmp = load('data');
   data=tmp.data
else
   data = struct;
end

お役に立てれば、

カプラ

于 2017-05-14T13:48:05.200 に答える