未知矩阵大小的 matlab gui 句柄
matlab gui handles for unknown matrix size
我现在正在编写一个 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
(或任何其他想法也会很好)到运行?
您可以在进入循环之前检查列数,然后创建动态字段以根据循环索引命名它们(检查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]
不要忘记预分配内存的好习惯,尤其是当您的数据很大时。
希望对您有所帮助!
您可以为 channel
创建元胞数组:
numch = size(handles.matrix, 2);
for i = 1:numch
handles.Ch01Gr{i} = handles.matrix.Data(:, i);
end
我现在正在编写一个 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
(或任何其他想法也会很好)到运行?
您可以在进入循环之前检查列数,然后创建动态字段以根据循环索引命名它们(检查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]
不要忘记预分配内存的好习惯,尤其是当您的数据很大时。
希望对您有所帮助!
您可以为 channel
创建元胞数组:
numch = size(handles.matrix, 2);
for i = 1:numch
handles.Ch01Gr{i} = handles.matrix.Data(:, i);
end