我有一個將資料輸出到許多檔案中的專案。這些檔案看起來像這樣解釋readmatrix
:
ans =
8×8 table
Date_Time EZOO2Con___ EZOCO2Con_ppm_ SGPCO2Con_ppm_ SGPTVOC_ppb_ BMEHumidity___ BMEPressure_Pa_ BMETemp_DegC_
___________________ ___________ ______________ ______________ ____________ ______________ _______________ _____________
09/06/2022 11:55:17 19.16 419 400 0 48.5 95948 22.57
09/06/2022 11:55:18 19.16 419 400 0 48.89 99577 22.58
09/06/2022 11:55:19 19.16 419 400 0 48.89 99578 22.58
09/06/2022 11:55:20 19.15 420 400 0 48.84 99584 22.57
09/06/2022 11:55:21 19.15 420 400 0 48.95 99574 22.58
09/06/2022 11:55:22 19.15 421 400 0 49.15 99578 22.57
09/06/2022 11:55:23 19.15 421 400 0 48.9 99577 22.56
09/06/2022 11:55:24 19.15 422 400 0 48.9 99573 22.57
對于我之前的測驗,我有大約。289 個這種格式的單獨檔案,我想將它們組合成 8 個陣列以進行繪圖。
Date_Time 列是一個字串,其中 MM/DD/YYYY 和 HH:MM:SS 用空格分隔。使用 table2array 命令時,我可以將每個檔案資料的日期和時間列轉換為日期時間陣列。但是,我無法使用cat
orvertcat
函式將日期和時間列附加到我的“組合”陣列中。下面是給我帶來麻煩的代碼:
for k = 1:length(fileList)
baseFileName = fileList(k).name;
fullFileName = fullfile(fileList(k).folder, baseFileName);
fprintf(1, 'Now reading %s\n', fullFileName);
data = readtable(fullFileName);
timecol = data(:,1);
EZOCO2col = data(:,2);
EZOO2col = data(:, 3);
SGP30CO2col = data(:, 4);
SGP30TVOCcol = data(:, 5);
BME280Humcol = data(:, 6);
BME280Presscol = data(:, 7);
BME280Tempcol = data(:, 8);
timecol_array = table2array(timecol);
EZOCO2col_array = table2array(EZOCO2col);
EZOO2col_array = table2array(EZOO2col);
SGP30CO2col_array = table2array(SGP30CO2col);
SGP30TVOCcol_array = table2array(SGP30TVOCcol);
BME280Humcol_array = table2array(BME280Humcol);
BME280Presscol_array = table2array(BME280Presscol);
BME280Tempcol_array = table2array(BME280Tempcol);
timecol_tot = cat(1, timecol_tot, timecol_array);
EZOCO2col_tot = cat(1, EZOCO2col_tot, EZOCO2col_array);
EZOO2col_tot = cat(1, EZOO2col_tot, EZOO2col_array);
SGP30CO2col_tot = cat(1, SGP30CO2col_tot, SGP30CO2col_array);
SGP30TVOCcol_tot = cat(1, SGP30TVOCcol_tot, SGP30TVOCcol_array);
BME280Humcol_tot = cat(1, BME280Humcol_tot, BME280Humcol_array);
BME280Presscol_tot = cat(1, BME280Presscol_tot, BME280Presscol_array);
BME280Tempcol_tot = cat(1, BME280Tempcol_tot, BME280Tempcol_array);
end
我每次都會收到此錯誤:
Error using datetime/cat (line 1376)
All inputs must be datetimes or date/time character vectors or date/time strings.
Error in Plot_attempt_9_6_22_1 (line 66)
timecol_tot = cat(1, timecol_tot, timecol_array);
根據How to preallocate a datetime array in matlab,我嘗試過:
timecol_tot = [];
,
timecol_tot = datetime([],[],[],[],[],[]);
,
timecol_tot = NaT(1,1);
無濟于事。
因為每個檔案的長度可能會有所不同,所以我沒有嘗試在傳入資料的大小中預先分配 datetime 陣列,因為這可能不適用于不同的資料集。但是,如果我只有一個檔案,它確實有效。
有沒有一種方法可以讓我只初始化一個空陣列并將陣列連接datetime
到它而不定義datetime
要添加的第一個集合的大小?
uj5u.com熱心網友回復:
您要問 2 個問題,我是新來的,但一些版主可能會告訴您將其分解為 2 個單獨的問題。
無論如何,我都在這里回答:
- 錯誤似乎不是來自
cat
使用您提供的資料,我已經復制了 cat 輸出并且 cat 作業正常;它DATATIME
在需要時連接并浮動告訴。
問題必須在其他地方;只要您cat
使用相同的格式供稿,就不應該有任何錯誤。
錯誤來自一個名為Plot_attempt_9_6_22_1
對嗎?
任何一個
- 您要發送到
plot
行而不是列,因此plot
輸入向量包含混合格式、轉置或多個丟失的地方,
或者
- 您在某處將日期/時間格式與非日期/時間型別的內容混合在一起。
2.- 你真的需要預先分配記憶體嗎?
無論如何,MATLAB 建議使用以下運算式預分配表:
T = table('Size',sz,'VariableTypes',varTypes)
不是問題中提到的 C/C 風格
如果您發現此答案有用,您會考慮將其標記為好答案嗎?無論如何,感謝您閱讀我的答案。
uj5u.com熱心網友回復:
我最終通過添加一條if
陳述句解決了這個問題,現在,它看起來像這樣:
if k == 1
timecol_tot = timecol_array;
EZOCO2col_tot = cat(1, EZOCO2col_tot, EZOCO2col_double);
EZOO2col_tot = cat(1, EZOO2col_tot, EZOO2col_double);
SGP30CO2col_tot = cat(1, SGP30CO2col_tot, SGP30CO2col_array);
SGP30TVOCcol_tot = cat(1, SGP30TVOCcol_tot, SGP30TVOCcol_array);
BME280Humcol_tot = cat(1, BME280Humcol_tot, BME280Humcol_array);
BME280Presscol_tot = cat(1, BME280Presscol_tot, BME280Presscol_array);
BME280Tempcol_tot = cat(1, BME280Tempcol_tot, BME280Tempcol_array);
else
timecol_tot = cat(1, timecol_tot, timecol_array);
EZOCO2col_tot = cat(1, EZOCO2col_tot, EZOCO2col_double);
EZOO2col_tot = cat(1, EZOO2col_tot, EZOO2col_double);
SGP30CO2col_tot = cat(1, SGP30CO2col_tot, SGP30CO2col_array);
SGP30TVOCcol_tot = cat(1, SGP30TVOCcol_tot, SGP30TVOCcol_array);
BME280Humcol_tot = cat(1, BME280Humcol_tot, BME280Humcol_array);
BME280Presscol_tot = cat(1, BME280Presscol_tot, BME280Presscol_array);
BME280Tempcol_tot = cat(1, BME280Tempcol_tot, BME280Tempcol_array);
end
我收到型別錯誤的另一個原因是我的一些檔案是空的或損壞的。如果您遇到類似問題,請檢查以確保您使用的不是空的或損壞的 csv!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/507951.html