【问题标题】:matlab gui handles for unknown matrix size未知矩阵大小的matlab gui句柄
【发布时间】:2015-08-02 09:57:20
【问题描述】:

我现在正在编写一个 GUI,其中包含一个加载矩阵的按钮:

function Load_Profile_Callback(hObject, eventdata, handles)
% hObject    handle to Load_Profile (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

[FileName PathName] = uigetfile('*.mat','MATLAB Files');
handles.matrix=importdata([PathName FileName]);

接下来,我想将此矩阵的每一列定义为不同的通道,例如:

handles.Ch01Gr01=handles.matrix.Data(:,2);
handles.Ch01Gr02=handles.matrix.Data(:,3);
handles.Ch01Gr03=handles.matrix.Data(:,4);
handles.Ch01Gr04=handles.matrix.Data(:,5);
handles.Ch01Gr05=handles.matrix.Data(:,6);
handles.Ch01Gr06=handles.matrix.Data(:,7);
handles.Ch01Gr07=handles.matrix.Data(:,8);

如果我不知道这个矩阵中有多少列, 在for loop 中是否有任何选项可以解决这个问题(或者任何其他想法也可以)在这个矩阵维度上运行?

【问题讨论】:

    标签: matlab user-interface for-loop matrix handle


    【解决方案1】:

    您可以为channel 创建一个元胞数组:

    numch = size(handles.matrix, 2);
    for i = 1:numch
        handles.Ch01Gr{i} = handles.matrix.Data(:, i);
    end
    

    【讨论】:

      【解决方案2】:

      您可以在进入循环之前检查列数,然后根据循环索引创建动态字段来命名它们(检查here)。

      这是一个示例 GUI,其中按下按钮会加载矩阵 A(一个神奇的 4x4 矩阵...A = magic(4)),我将其存储在文件“A.mat”中。

      function LoadDataGUI
      clc
      clear
      hfigure = figure('Position',[200 200 100 100]);
      
      handles.LoadButton = uicontrol('Style','push','Position',[50 50 50 20],'String','Load','Callback',@(s,e) LoadDataCllbck);
      
      guidata(hfigure,handles);
      
          function LoadDataCllbck
      
              handles = guidata(hfigure);
      
              %// Load matrix. A is actually a magic(4) matrix.
              handles.Data = load('A.mat');
      
              %// Check # of columns
              NumCol = size(handles.Data.A,2);
      
              for k = 2:NumCol
      
                  %// Create dynamic field name
                  CurrField = sprintf('Ch01Gr%i',k-1);
      
                  %// Assign it to the handles structure.
                  handles.(CurrField) = handles.Data.A(:,k);
      
              end
      
              guidata(hfigure,handles);
          end
      
      end
      

      这里,CurrField 在每次迭代中都像这样:

      CurrField =
      
      Ch01Gr1
      
      
      CurrField =
      
      Ch01Gr2
      
      
      CurrField =
      
      Ch01Gr3
      

      您当然可以使用sprintf 自定义格式。

      按下按钮后,这里是handles结构的内容:

             LoadButton: 329.0085
                Data: [1x1 struct]
             Ch01Gr1: [4x1 double]
             Ch01Gr2: [4x1 double]
             Ch01Gr3: [4x1 double]
      

      不要忘记预先分配内存的好习惯,尤其是在您的数据很大时。

      希望有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-27
        相关资源
        最近更新 更多