Я пытаюсь сделать графический интерфейс в Matlab, который принимает значения в таблице для преобразования ее в матрицу, но идея состоит в том, что пользователь может сначала установить количество строк и столбцов.
Панель выглядит вот так

и код кнопки
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 я обновил код до функция pushbutton1_Callback (hObject, данные события, дескрипторы)
% 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 быстрее, чем методы установки и получения.
Итак, что вы можете сделать, это:
handles.uitable1.Data = cell(rows, cols);
или, конечно, как вариант:
set(handles.uitable1, 'Data', cell(rows,cols));
Если вы хотите преобразовать данные в матрицу, вы можете использовать:
matrix = cell2mat(handles.uitable1.Data);
Если ваша таблица содержит нечисловые значения:
tableData = handles.uitable1.Data;
tableData = [str2double(tableData(:, 1)), cell2mat(tableData(:, 2))];
Надеюсь это поможет. Дайте мне знать, если вы решите свою проблему.
Я обновил вопрос новой информацией, надеюсь, вы сможете попробовать, если не слишком сложно спросить, спасибо!
Есть некоторые проблемы с вашим кодом:
num_elem =
1×2 cell array
{0×0 char} {0×0 char}
Чтобы решить все это, я переписал для вас функцию обратного вызова. Вы можете напрямую вставить этот код в свой обратный вызов, заменив свой. В конце я должен дать вам матрицу, которую вы хотите, она есть на моем компьютере.
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
Просто проверьте, все ли имена переменных одинаковы, и не забудьте принять это в качестве ответа. Надеюсь, поможет.
Вы хотите правильно преобразовать значения ячеек в число?