将数据附加到 MatLab 中 'for' 循环内的消息框
Appending data to a message box inside a 'for' loop in MatLab
我编写了一个函数,该函数使用用户输入在元胞数组的其中一列及其索引中查找壁橱值 returns。我使用此索引打印该索引处的所有列值。然后向用户显示一个消息框。
prompt2 = 'Enter the Luminance value in cd/m^2';
linp = inputdlg (prompt2,'Input Value',1);
luser=str2double(linp);
for ab=1:num_files
files=char(fileloc(ab));
dev=dlmread(files);
round_tmp=abs(dev(:,4)-luser);
[val,ind]=min(round_tmp);
display(ind);
msgbox(sprintf(' Values at %0.3f cd/m^2 for \n %s are:- \n\n Voltage %0.3f V\n Current den. %0.3f mA/cm^2 \n Current %0.3f mA \n Efficiency %0.3f cd/A',luser,forlegend{ab},dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6)),'Resulting Values');
end
现在我在 'for' 循环中对几个文件重复该过程,每次它都会弹出一个新的 'message box like' 这个:
Message boxes
在单个消息框中显示所有数据的最简单方法是什么?我尝试存储在一个文件中,re-displaying 它与消息框标题混淆。我只想在单个消息框中将所有数据一个接一个地显示出来。有什么建议吗?
感谢您的帮助。
如果消息框中要显示很多行,msgbox
不是最佳解决方案,因为它没有滚动条,您只会看到部分行。
在这种情况下,一个简单的解决方案可能是通过以下方式构建您自己的消息框:
- 创建
figure
- 添加一个
uicontrol editbox
- 添加一个 OK
pushbutton
关闭图形(通过按钮的回调
然后在循环中你可以:
- 每次迭代生成字符串
- 将其附加到上一个
- 设置字符串为
string
属性的uicontrol editbox
您可以使用 guide
创建更复杂的 GUI。
此解决方案在以下代码中实现:
创建您的消息框
% Create the figure
f=figure('unit','normalized','name','MY-_MESSAGE-_BOX','numbertitle','off');
% Add an edit text box
my_msg_box=uicontrol('parent',f,'style','edit','max',3,'unit','normalized', ...
'HorizontalAlignment','left','position',[.1 .1 .7 .7])
% Add the OK button and set its callback to close the figure
ok_bt=uicontrol('parent',f,'style','pushbutton','unit','normalized', ...
'string','OK','position',[.85 .5 .1 .1],'callback','delete(f);clear f')
创建字符串并将其添加到编辑框
编辑以使 OP
评论后的代码更加清晰
在下面的示例中,在每次迭代期间,都会生成您要显示的字符串(为了测试代码,我将变量 luser,dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6)
替换为 "numbers")
% Generate the string in the loop
str='';
for i=1:10
% Replace the msgbox instruction with the code to simply print the
% string
% msgbox(sprintf(' Values at %0.3f cd/m^2 for \n %s are:- \n\n Voltage %0.3f V\n Current den. %0.3f mA/cm^2 \n Current %0.3f mA \n Efficiency %0.3f cd/A',luser,forlegend{ab},dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6)),'Resulting Values');
str=sprintf('%s\n Values at %0.3f cd/m^2 for \n %s are:- \n\n Voltage %0.3f V\n Current den. %0.3f mA/cm^2 \n Current %0.3f mA \n Efficiency %0.3f cd/A', ...
str,123,'abcdef',111,222,333,444);
% str=sprintf('%s This is:\n the STRING #%d\n\n',str,i)
% Add the strong to the edit box
set(my_msg_box,'string',str)
end
基本上,您必须用 sprintf
调用替换 msgbox
指令。
关于 sprintf
调用的实现(恢复变量 luser,dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6)
的一部分),您必须:
- 添加
%s
作为第一个格式描述符
- 添加
str
作为第一个输入参数
这将允许 "appending" 字符串。
如果您只有几行要显示,您可以简单地在循环的每次迭代中生成字符串并将其追加到前一个,而无需调用 msgbox
函数。
在循环结束时,您可以调用 msgbox
并为其提供 "whole" 字符串。
str='';
% Generate the string in a loop
for i=1:10
str=sprintf('%sThis is:\n the STRING #%d\n\n',str,i)
end
% Display the final string in the msgbox
msgbox(str,'Resulting Values')
希望这对您有所帮助。
Qapla'
我编写了一个函数,该函数使用用户输入在元胞数组的其中一列及其索引中查找壁橱值 returns。我使用此索引打印该索引处的所有列值。然后向用户显示一个消息框。
prompt2 = 'Enter the Luminance value in cd/m^2';
linp = inputdlg (prompt2,'Input Value',1);
luser=str2double(linp);
for ab=1:num_files
files=char(fileloc(ab));
dev=dlmread(files);
round_tmp=abs(dev(:,4)-luser);
[val,ind]=min(round_tmp);
display(ind);
msgbox(sprintf(' Values at %0.3f cd/m^2 for \n %s are:- \n\n Voltage %0.3f V\n Current den. %0.3f mA/cm^2 \n Current %0.3f mA \n Efficiency %0.3f cd/A',luser,forlegend{ab},dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6)),'Resulting Values');
end
现在我在 'for' 循环中对几个文件重复该过程,每次它都会弹出一个新的 'message box like' 这个: Message boxes 在单个消息框中显示所有数据的最简单方法是什么?我尝试存储在一个文件中,re-displaying 它与消息框标题混淆。我只想在单个消息框中将所有数据一个接一个地显示出来。有什么建议吗?
感谢您的帮助。
如果消息框中要显示很多行,msgbox
不是最佳解决方案,因为它没有滚动条,您只会看到部分行。
在这种情况下,一个简单的解决方案可能是通过以下方式构建您自己的消息框:
- 创建
figure
- 添加一个
uicontrol editbox
- 添加一个 OK
pushbutton
关闭图形(通过按钮的回调
然后在循环中你可以:
- 每次迭代生成字符串
- 将其附加到上一个
- 设置字符串为
string
属性的uicontrol editbox
您可以使用 guide
创建更复杂的 GUI。
此解决方案在以下代码中实现:
创建您的消息框
% Create the figure
f=figure('unit','normalized','name','MY-_MESSAGE-_BOX','numbertitle','off');
% Add an edit text box
my_msg_box=uicontrol('parent',f,'style','edit','max',3,'unit','normalized', ...
'HorizontalAlignment','left','position',[.1 .1 .7 .7])
% Add the OK button and set its callback to close the figure
ok_bt=uicontrol('parent',f,'style','pushbutton','unit','normalized', ...
'string','OK','position',[.85 .5 .1 .1],'callback','delete(f);clear f')
创建字符串并将其添加到编辑框
编辑以使 OP
评论后的代码更加清晰在下面的示例中,在每次迭代期间,都会生成您要显示的字符串(为了测试代码,我将变量 luser,dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6)
替换为 "numbers")
% Generate the string in the loop
str='';
for i=1:10
% Replace the msgbox instruction with the code to simply print the
% string
% msgbox(sprintf(' Values at %0.3f cd/m^2 for \n %s are:- \n\n Voltage %0.3f V\n Current den. %0.3f mA/cm^2 \n Current %0.3f mA \n Efficiency %0.3f cd/A',luser,forlegend{ab},dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6)),'Resulting Values');
str=sprintf('%s\n Values at %0.3f cd/m^2 for \n %s are:- \n\n Voltage %0.3f V\n Current den. %0.3f mA/cm^2 \n Current %0.3f mA \n Efficiency %0.3f cd/A', ...
str,123,'abcdef',111,222,333,444);
% str=sprintf('%s This is:\n the STRING #%d\n\n',str,i)
% Add the strong to the edit box
set(my_msg_box,'string',str)
end
基本上,您必须用 sprintf
调用替换 msgbox
指令。
关于 sprintf
调用的实现(恢复变量 luser,dev(ind,1),dev(ind,5),dev(ind,2),dev(ind,6)
的一部分),您必须:
- 添加
%s
作为第一个格式描述符 - 添加
str
作为第一个输入参数
这将允许 "appending" 字符串。
如果您只有几行要显示,您可以简单地在循环的每次迭代中生成字符串并将其追加到前一个,而无需调用 msgbox
函数。
在循环结束时,您可以调用 msgbox
并为其提供 "whole" 字符串。
str='';
% Generate the string in a loop
for i=1:10
str=sprintf('%sThis is:\n the STRING #%d\n\n',str,i)
end
% Display the final string in the msgbox
msgbox(str,'Resulting Values')
希望这对您有所帮助。
Qapla'