Я создаю подходящий Nx3, поскольку он кажется намного проще, чем редактирование нескольких текстов, когда N высокое. Я инициализировал столбцы как массив ячеек, чтобы изначально получить «пустую» таблицу.

hinitial = cell(N,1);
hfinal = cell(N,1);
hporosity = cell(N,1);
DataInput = [hinitial;hfinal;hporosity];
ColumnName = {'n_Initial','n_Final','Porosity'};
ColumnFormat = {'numeric', 'numeric', 'numeric'};
ColumnEditable = [false true false];

htable = uitable(fig,'Units','pixels','Position',[20 20 260 204],...
         'Data', DataInput,...
         'ColumnName', ColumnName,...
         'ColumnEditable', ColumnEditable);  

1) С помощью этой кнопки я хочу распечатать данные в первом столбце.

function uploadbutton_Callback(source,eventdata) 
S = load('n.mat');
for K = 1:N
set(htable(K,1),'Data',num2cell(S.n(K)));
end
end

Но это печатает только для первой строки этого столбца. Затем отображается эта ошибка.

Index exceeds matrix dimensions.
Error in bandprovaprog/uploadbutton_Callback (line 122)
set(htable(K,1),'Data',num2cell(S.n(K)));
Error while evaluating UIControl Callback.

2) Во втором столбце я хочу вручную ввести данные, а затем сохранить результаты в файле mat с помощью кнопки. Мои усилия на данный момент таковы:

function donebutton_Callback(source,eventdata) 

m = zeros(1,N);
 for J = 1:N
 m(J) = str2double(get(hfinal{J},'String'));  
 end
save('m.mat','m');
end

3) В последнем столбце снова используется набор для печати в третьем столбце, поэтому я думаю, что смогу сделать это, когда узнаю, как это сделать 1)

EDIT2: редактирование donebutton_Callback

function donebutton_Callback(source,eventdata) 

 m = zeros(1,N);
 m(1:N) = str2double(htable.Data(1:N,2),'Data'); 
 save('m.mat','m');
end

Я хочу поместить содержимое второго столбца в m.mat

0
Jack 15 Дек 2017 в 13:29

1 ответ

Лучший ответ

1) Ваша команда set кажется изворотливой, установка такого Data будет пытаться установить все данные, которые я думаю. Вместо этого просто назначьте конкретному элементу данных

function uploadbutton_Callback(source,eventdata) 
    S = load('n.mat');
    for K = 1:N
        htable.Data{K,1} = S.n(K);
    end 
end

Еще лучше векторизуйте свой код и избегайте зацикливания

function uploadbutton_Callback(source,eventdata) 
    S = load('n.mat');
    htable.Data(1:N,1) = num2cell(S.n(1:N));
end

Аналогично для (2) не используйте get, просто обращайтесь к данным, как показано выше.


Изменить:

Ваша новая проблема заключается в следующем. Вы создаете 3 массива ячеек Nx1, а затем объединяете их для передачи в качестве данных в вашу таблицу. При попытке отредактировать столбец 2 ваших данных вы не можете, потому что вы получаете следующую ошибку

Предупреждение: данные таблицы не доступны для редактирования в этом месте.

Это связано с тем, что (как предлагается в этом ответе) вы не предоставляете достаточно данных для заполнения всех столбцов таблицы. Сначала это сбивает с толку, пока вы не заглянете в свое рабочее пространство ...

workspace

Вы ожидаете, что эта переменная будет Nx3, но вместо этого это 3Nx1! Вам нужно использовать запятые для объединения строк вместо точки с запятой для объединения столбцов при формировании DataInput:

DataInput = [hinitial, hfinal, hporosity];
% Equivalently to remove ambiguity, you could use: 
% DataInput = horzcat(hinitial, hfinal, hporosity)

После обновления таблица ведет себя так, как ожидалось.

1
Wolfie 18 Дек 2017 в 13:16