2017-05-13 7 views
1

私はボタン(SAVE)を押すと、いくつかのフィールドの値をとり、特定の関数を計算し、その結果をデータに保存する簡単なGUIを作成しました構造。 私はこのデータ構造をプログラムの外部にしたい、つまりMatlabの出口に残しておき、プログラムの次のオープニングでこのデータ構造を利用可能でアップグレード可能でなければなりません。入れ子なしで既存の.matファイルにデータ構造を保存する

これを行うには、必要に応じて保存して読み込む変数dataを使用しました。

問題は正しく動作しないということです。dataの構造が不思議に満ちています。 enter image description here

あなたが見ることができるように、他のではなく、リストの中の構造があります: enter image description here

保存された構造はこれです:

は、私はあなたにおそらくもっと説明であるGIFを表示します要素。どうして?

Iは、(nは画像の数である)、n個の要素を含むdata構造を有したいと各要素は9つのフィールド(namecategorysiftOctavessiftLevelssiftPeaksiftEdgenumFeaturessiftFeaturessiftDescriptorsから成り)。

%% 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); 

ありがとう:

これは、コードの一部です!

答えて

1

Pをdata.matファイルを読み込むと、直面している問題が発生します。

また、loadでリライトされた変数の名前としてdataを使用すると、混乱が発生します。

命令

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

data.matを読み取り、それがdataという名前の構造体に含まれている「データ」を保存するので、あなたの構造体は、実際にloadによって返される構造体datafiledです。

loadコールの直後にブレークポイントを設定して、バリアビームdataを調べることでテストできます。

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

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

希望、

Qapla」

1

load関数の出力変数を使用すると、変数dataを.matファイルからdataという構造体に格納しているので、入れ子になります。 loadを出力せずに使用すると動作します。

if exist('data.mat', 'file') == 2 
    %// data = load('data'); % does not work! 
    load('data'); % does work! 
else 
    data = struct; 
end 

data(1).a = 42; 
data(2).a = 3; 
data(1).b = 41; 
data(2).b = 4; 

%// make sure you just store what you want to store, in this case "data" 
save('data.mat','data') 

また、私はdataグローバル変数を宣言避けるだろう。代わりに、あなたはあなたのGUIのすべての機能が同じFigureウィンドウの一部であることを、事実を使用することができ、したがって、可能なFigureハンドルを持っている:

hFig = gcf; 
さらに figureのインスタンスを行う dynamic propertiesを追加するために許可されている

、これだけFigureハンドル自体にデータを格納します。

hFig = gcf; 
addprop(hFig,'globalData') 

data = struct; 
hFig.globalData = data; 

% ... 

、次の機能であなただけの操作を行います。

data = hFig.globalData 
+0

OPは、構造体配列の場合と協力しています。この場合、 '-struct'オプションはデータを保存するときには使用できません。 –

+0

@il_raffa、そうです。ありがとうございました。しかし、一時変数は必要ありません! – thewaywewalk

関連する問題