这个小程序主要实现了输入n次交易和p个物品,随机产生n行p列的购物清单。其中p值最大不能超过30列,因为我设计的编码数组最大只有30列。
1、产生购物清单的程序代码:
function T=produce_T(n,p)
% 产生随机交易矩阵
T= randi([0,1],n,p);
% 编码库 大概有30类物品
MyCodes={'奶酪','糖果','足球','衣服','靴子','鸡肉','洗面奶','沐浴露','洗发水','梳子','镜子','电池','发夹','戒指','胸针','复印机','耳机','字典','充电器','围巾','领带','西服','饮水机','台球','指南针','毛巾','热水瓶','水杯','鼠标','卫生纸'};
Total_num=length(MyCodes);
% 产生编码规则矩阵 randperm(N,K) 产生1-N的不重复的数,K个
code=MyCodes(randperm(Total_num,p));
% 生成购物清单txt
fid=fopen('mygoods.txt','w');
for i=1:size(T,1)
% 获得元素为1的列下标
[~,ib]=find(T(i,:)==1);
% 进行编码 将cell数组转化为字符数组
code1=code(ib);
% 因为不同的cell之间不会有空格,需要手动添加
code2=cellfun(@(u)[u,' '],code1(1:end-1),'UniformOutput',false);
str_arry=cell2mat(code2);
% 写入文件
fprintf(fid,'%s\n',str_arry);
end
fclose(fid);
disp(['生成购物清单到''mygoods.txt' '完成!']);
购物清单如图所示:n=10,p=20。
2、设计matlab的GUI界面
2.1、fig界面:
需要注意静态文本框的max需要大于1,进度条默认为0-1之间变化。
2.2 相关代码
2.2.1读取编辑框中的交易次数:
function n_Callback(hObject, eventdata, handles)
% hObject handle to n (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of n as text
% str2double(get(hObject,'String')) returns contents of n as a double
n=str2double(get(hObject,'String'))
if n<=1
errordlg('交易次数不能少于1')
elseif n~=fix(n)
errordlg('输入必须为整数');
end
2.2.2读取编辑框中的物品种类:
function p_Callback(hObject, eventdata, handles)
% hObject handle to p (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of p as text
% str2double(get(hObject,'String')) returns contents of p as a double
p=str2double(get(hObject,'String'))
if p<=1 || p>30
errordlg('物品个数不能少于1或者多于30');
elseif p~=fix(p)
errordlg('输入必须为整数');
end
我做了一些输入校验,不能输入除整数之外的字符。
2.2.3 点击确认按钮之后的事件:
% --- Executes on button press in pushbutton1.
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)
n=str2double(get(handles.n,'String'))
p=str2double(get(handles.p,'String'))
if n<=1 || p<=1 || p>30
errordlg('交易次数或物品个数不能小于1');
return
elseif n~=fix(n) || p~=fix(p)
errordlg('输入必须为整数');
return
else
T=produce_T(n,p);
% 加载文档中的内容
ex=importdata('mygoods.txt');
row=size(ex,1)
if row>24 % 24假设为最大显示行数
set(handles.T_data,'String',ex(1:24));
% 设置滑动条位置 不能取整
x=24/row;
set(handles.slider1,'Value',(1-x));
else
set(handles.T_data,'String',ex);
% 设置滑动条位置
set(handles.slider1,'Value',0);
end
end
produce_T(n,p)是最前面写的购物清单的代码。
我设置的最大显示行数为24行,小于24,就直接将滑动条位置移动到最底部,不能在下滑。大于24,则计算24行所占总行数的比例,设置滑动条处于计算出来的位置。
效果图如下:
2.2.4 滑动条移动的事件
% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
ex=importdata('mygoods.txt');
row=size(ex,1)
if row>24
% set(hObject,'Value',1-24/row);
slider = get(hObject,'Value')
x1=1-slider;
% 取得当前需要显示的数据量
count=round(row*x1)
if count>24
% 显示对应数据
set(handles.T_data,'String',ex(count-24:count));
end
else
% 显示对应数据
set(handles.T_data,'String',ex(1:row));
set(hObject,'Value',0);
end
如果总的行数小于24的话,则直接显示所有数据,并将滑动条置于底部。若大于24的话,则先获取当前的滑动条值,再计算出当前所需要显示的数据量,最后显示当前数据量-24——当前数据量区间的数据。
效果图:
txt文件: