2012-06-17 93 views
0

我已經在我的電腦中安裝了Matlab r2010a。xlsread和waitbar MATLAB

如何使用matlab中的xlsread函數並行讀取數據時在等待欄圖中顯示更新的進度?

非常感謝您的回答。

(EDIT)

我的意思是,雖然xlsread加載一個數據一個你可以看到在waitbar加載進度。

有什麼辦法嗎?

PD:我只是想從一個加載數據* .xls文件

+1

什麼你的意思是「平行」? AFAIK,'xlsread'並不是固有的並行化。無論如何,我不認爲有辦法做到這一點,因爲你必須直接修改xlsread來顯示進度。 – plasma

回答

0

有幾個選項:

  1. 一個困難的選擇:創建一個.mex文件,並制定出不同版本的MATLAB沒有記錄的內存表示(可能相當困難,但我相信這是可能的一些調試器)。
  2. 更簡單的方法來做到這一點:創建您的使用xlsread.mxlsreadCOM.mxlsreadXLSX.m作爲departure.`
  3. 點自己myxlsread.m如果你需要的是在連續xlsread命令之間的循環更新waitbar,這是非常容易的。

1..mex文件的解決方案: 如果你想顯示一個xlsread函數調用的進步,我相信事情變得相當複雜。首先,您需要有兩個線程,爲此您需要使用.mex文件或其他方式。第二個問題是AFAIK xlsread沒有發送任何進度信號,這意味着你的函數需要以某種方式獲得被調用函數的變量(單元陣列或矩陣等)的內存地址。如果這是你想要的,那麼這個文檔可能是有用的:http://undocumentedmatlab.com/blog/matlabs-internal-memory-representation/請注意,MATLAB的內部存儲器表示形式完全沒有記錄,並且可能在不同的MATLAB版本中隨時改變,因此對於單個waitbar這將是太多工作。

2.myxlsread.m解決方案: 好消息是,xlsread不是一個內置的(至少在MATLAB R2012a沒有),所以你可以閱讀代碼,並與MATLAB調試跟蹤它沒有問題。因爲它不是內置的,所以創建自己的自定義myxlsread.m,以xlsread.mxlsreadCOM.mxlsreadXLSX.m爲例或直接修改它們以添加waitbar更新函數調用,如果在您的情況下版權問題不是一個問題(例如,你不分發代碼或當地法律允許)。我認爲修改或重新創建您的myxlsread.m是最可行的方法。

3.在一個循環的解決方案的xlsread: 但是,如果你想要的是獨立的xlsread函數調用之間更新waitbar,那麼這是不是一個問題的話,那會是這樣的:

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 
+0

嗨@nrz這是我的一次。你介意告訴我在加載數據時,我應該怎麼做才能在'xlsread.m'內逐步獲取更新的變量? 非常感謝 –