0

我已经在我的电脑上安装了 Matlab r2010a。

使用matlab中的xlsread函数并行读取数据时,如何在waitbar图中显示更新的进度?

非常感谢您的回答。

(编辑)

我的意思是,当xlsread正在一一加载数据时,您可以在waitbar中看到加载进度。

有什么办法吗?

PD:我只想从一个 *.xls 文件中加载数据

4

1 回答 1

0

有几个选项:

  1. 一个困难的选择:创建一个.mex文件并计算出不同的 MATLAB 版本的未记录内存表示(可能非常困难,但我相信使用一些调试器是可能的)。
  2. myxlsread.m一种更简单的方法:使用xlsread.m,xlsreadCOM.mxlsreadXLSX.m作为出发点创建自己的。
  3. 如果您只需要waitbar在连续xlsread命令之间循环更新,那非常容易。

1..mex文件解决方案:如果要显示单个函数调用的进度,xlsread我相信事情会变得相当复杂。首先,您需要有两个线程,为此您需要使用.mex文件或其他方式。第二个问题是 AFAIKxlsread不会发出任何进度信号,这意味着您的.mex函数需要以某种方式获取被调用xlsread函数的变量(元胞数组或矩阵等)的内存地址。如果这是您想要的,那么此文档可能会很有用: http: //undocumentedmatlab.com/blog/matlabs-internal-memory-representation/请注意,MATLAB 的内部存储器表示完全没有文档记录,并且可能随时更改,并且在不同的 MATLAB 版本中有所不同,因此对于单个而言,waitbar这将是太多的工作。

2.myxlsread.m解决方案:好消息是它不是内置的xlsread(至少不是在 MATLAB R2012a 中),因此您可以毫无问题地阅读代码并使用 MATLAB 调试器对其进行跟踪。由于它不是内置的,因此可能的选项是创建您自己的 custom ,myxlsread.mxlsread.m,为例或直接修改它们以添加更新函数调用,如果在您的情况下版权问题不是问题(例如。您不分发代码或当地法律允许)。我认为修改或重新创建你的是最可行的方法。xlsreadCOM.mxlsreadXLSX.mwaitbarmyxlsread.m

3.循环内xlsread解决方案:但是,如果您只想waitbar在单独xlsread的函数调用之间进行更新,那么这根本不是问题,它将类似于:

XlsFilenamesCellArray = { 'file1.xls', 'file2.xls', 'file3.xls' };
NumberOfFiles = size(XlsFilenamesCellArray, 2)

h = waitbar(0, '1', 'Name', 'xlsread loop progress', 'CreateCancelBtn', 'setappdata(gcbf,     ''canceling'', 1)');

for Index = 1:size(XlsFilenamesCellArray, 2)
    waitbar(Index/NumberOfFiles, h, sprintf('reading .xls file %d of %d', Index, NumberOfFiles));
    [num{Index}, text{Index}, raw{Index}] = xlsread(XlsFilenamesCellArray{Index});
end
于 2012-06-17T07:26:53.040 回答