我正在创建一个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)最后一列再次使用set在第三列中打印,所以我想我知道如何做就能做到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 :(得分: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列时,您不能,因为您收到以下错误
警告:此位置无法编辑表格数据。
这是因为(如this answer中所述)您没有提供足够的数据来填充表格的所有列。一开始这很令人困惑,直到你看到你的工作区......
您期望该变量为Nx3,而是3Nx1!在形成DataInput
时,您需要使用逗号来连接行,而不是使用分号来连接列:
DataInput = [hinitial, hfinal, hporosity];
% Equivalently to remove ambiguity, you could use:
% DataInput = horzcat(hinitial, hfinal, hporosity)
更新后,表格的行为符合预期。