【问题标题】:How to pass the value of a table to a matrix如何将表的值传递给矩阵
【发布时间】:2019-08-24 02:49:08
【问题描述】:

我试图在 matlab 中做一个 GUI,它接受表中的值以将其转换为矩阵,但想法是用户可以先设置行数和列数。
面板看起来像这样
按钮的代码是

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
rows =str2double(get(handles.edit_rows,'String'));
cols=str2double(get(handles.edit_cols,'String'));
num_elem=cell(rows,cols);
num_elem(:,:)={"};
set(handles.uitable1,'Data',num_elem)
set(handles.uitable1,'ColumnEditable',true(1,cols))

但是,如何导出或转换为矩阵,以便我可以对其应用函数?

更新 在 byetisener 的帮助下,我将代码更新为 function pushbutton1_Callback(hObject, eventdata, 句柄)

% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
filas=str2double(get(handles.edit_fila,'String'));
column=str2double(get(handles.edit_col,'String'));
num_elem=cell(filas,column);
num_elem(:,:)={''};
set(handles.uitable1,'Data',num_elem)
set(handles.uitable1,'ColumnEditable',true(1,column))
handles.uitable1.Data = cell(filas, column);
matrix = cell2mat(handles.uitable1.Data);
matrix

但这给出了一个空矩阵

它没有获取单元格的值,假设按钮调整大小并同时复制值,如果不是,一旦矩阵调整大小,如何在另一个按钮中复制?

【问题讨论】:

  • 您想将单元格值转换为正确的数字吗?
  • 是的,没错!
  • 单元格可以包含多种数据类型。只需访问单元格,并将其转换为您想要的类型。根据您的代码,您的单元格内容已经是双倍的。

标签: matlab user-interface linear-algebra


【解决方案1】:

您的代码存在一些问题:

  1. 您实际上并没有在这里分配值,您只是将 uitable 的 Data 设置为空单元格数组。
num_elem =

  1×2 cell array

    {0×0 char}    {0×0 char}
  1. 如果您成功了,您的代码会将您想要的所有内容仅写入 uitable 的第一列。因为您没有遍历行。按钮仅添加到第一行。
  2. 如果表中有不同的数据类型,cell2mat() 函数将不起作用。您可能认为您没有不同的数据类型,但空单元格是单元格类型,而您输入的数据是双精度类型,所以它是。

为了解决所有这些问题,我为您重写了一个回调函数。您可以直接将此代码粘贴到您的回调中,替换您的。最后我应该给你你想要的矩阵,它在我的电脑里。

filas  = str2double(handles.edit_fila.String);
column = str2double(handles.edit_col.String);

% This loop looks for an empty row to write new data
for i = 1:length(handles.uitable1.Data) 
   if isempty(handles.uitable1.Data{i,1})
       handles.uitable1.Data(i,1) = {filas};
       handles.uitable1.Data(i,2) = {column};
       break;
   else
       disp('Error occured');
   end
end

% This double for loop check if there are any empty cells 
% if it finds one, it changes it to 0, so all the cells have the same type
for i = 1:length(handles.uitable1.Data) 
    for j = 1:2                         
        if isempty(handles.uitable1.Data{i,j})
            handles.uitable1.Data(i,j) = {0};
        else
            disp('Error occured');
        end
    end
end

matrix = cell2mat(handles.uitable1.Data); % The matrix you want

只需检查所有变量名称是否相同,不要忘记接受是作为答案。希望能帮助到你。

【讨论】:

    【解决方案2】:

    我不确定这是否能回答您的问题,但您可以采用这种方法。

    首先,如果您有兴趣,在 MATLAB 中使用点表示法比 setter 和 getter 方法更快。

    所以,你可以做的是:

    handles.uitable1.Data = cell(rows, cols);
    

    或者,当然,也可以:

    set(handles.uitable1, 'Data', cell(rows,cols));
    

    如果您想要将 uitable 中的数据转换为矩阵,您可以使用:

    matrix = cell2mat(handles.uitable1.Data);
    

    如果您的表格包含非数字值:

    tableData = handles.uitable1.Data;
    tableData = [str2double(tableData(:, 1)), cell2mat(tableData(:, 2))];
    

    希望这会有所帮助。如果你解决了你的问题,请告诉我。

    【讨论】:

    • 我已经用新的信息更新了问题,希望你能试一试,如果问的不是太多,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多