Как передать значение таблицы в матрицу - PullRequest
0 голосов
/ 02 апреля 2019

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

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, 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)
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

, но это дает пустую матрицу
enter image description here

Это не принимает значения ячеек, предполагается, что кнопка изменяет размеры и копирует значения одновременно, если не как скопировать в другую кнопку один разматрица изменяется?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Есть некоторые проблемы с вашим кодом:

  1. Вы на самом деле не присваиваете значения, вы просто устанавливаете Данные для пригодного для использования массива пустых ячеек.
num_elem =

  1×2 cell array

    {0×0 char}    {0×0 char}
  1. Если вам когда-нибудь удастся, ваш код напишет все, что вы хотите, только в первый столбец. Потому что вы не перебираете строки. Кнопка только добавляет в первый ряд.
  2. Функция cell2mat () не будет работать, если в вашей таблице есть разные типы данных. Вы можете подумать, что у вас нет разных типов данных, но пустые ячейки являются ячейками типа, а вводимые вами данные имеют тип double, так что это так.

Чтобы решить все это, я переписал функцию обратного вызова для вас. Вы можете напрямую вставить этот код в ваш обратный вызов, заменив свой. Я должен дать вам матрицу, которую вы хотите в конце, это на моем компьютере.

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

Просто проверьте, все ли имена переменных одинаковы, и не забудьте принять в качестве ответа. Надеюсь, поможет.

1 голос
/ 03 апреля 2019

Я не уверен, отвечает ли это на ваш вопрос, но вы можете придерживаться этого подхода.

Прежде всего, если вам интересно, использование точечной нотации в MATLAB быстрее, чем методы setter и getter.

Итак, что вы можете сделать:

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))];

Надеюсь, это поможет.Дайте мне знать, если решите свою проблему.

...