删除uitable-Matlab中的选定行



我在GUI中(使用GUIDE(构建了一个uitable(4x5(,最后一行是逻辑的,这样我就可以选择要删除的行。

d = {'L1',1,10,true;'L2',2,20,true;'L3',3,30,false;'L4',4,40,true;'L4',5,50,false};
set(handles.outputTable,'Data',d)

我创建了一个按钮来删除选定的行,但我不工作:

function deleteButton_Callback(hObject, eventdata, handles)
% hObject    handle to deleteButton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
dataTable = (get(handles.outputTable,'data'));
[m n] = size(dataTable);
disp(dataTable);
for i = 1:m
if num2str(cell2mat(dataTable(i,4))) =='1'    
dataTable(i,:)=[];
end
end
disp('Modifed table')
disp(dataTable);

如何修复它,以便在GUI中重新设置表?

这是错误的:

for i = 1:m
if num2str(cell2mat(dataTable(i,4))) =='1'    
dataTable(i,:)=[];
end
end

首先,if num2str(cell2mat(dataTable(i,4))) =='1'if dataTable{i,4}==1的卷积等价物。您应该学会使用大括号{}来访问单元格数组的内容。

然后,只有当计数器减少时,它才会工作。看看会发生什么:

Test if row n should be deleted
Delete line n; the content of row (n+1) have now moved to row n
Increment counter i from value n to n+1
The row now at position n has never been tested for deletion !

第(n+1(行的内容永远不会被测试,因为删除操作会先将其向后移动,然后计数器会递增,而不会再次测试。解决办法是递减计数器。

for i = m:-1:1
if dataTable{i,4}   
dataTable(i,:)=[];
end
end

删除操作移动的行已经过测试,所以最后可以肯定的是,所有行都将经过测试。

现在,同样的结果可以通过单行以矢量化的形式获得:

dataTable = dataTable(cell2mat(dataTable(:,4))==0,:);

整个功能可以归结为:

function deleteButton_Callback(hObject, eventdata, handles)
dataTable = get(handles.outputTable,'data');
% Do some checks to make sure that the values input by are correct %
assert(all(cellfun(@isscalar,dataTable(:,4))), 'Last colum should contain scalars!');
set(handles.outputTable,'data' , dataTable(cell2mat(dataTable(:,4))==0,:));
end

最新更新