Table to Array conversion using a for loop

8 ビュー (過去 30 日間)
Ashfaq Ahmed
Ashfaq Ahmed 2022 年 7 月 11 日
コメント済み: Ashfaq Ahmed 2022 年 7 月 14 日
Hi! Is there a way I can do this operation within a for loop?
load 'temps-2021-11-16.mat'
temps_2021_11_16 = table2array(data(:,:));
load 'temps-2021-10-31.mat'
temps_2021_10_31 = table2array(data(:,:));
load 'temps-2021-10-15.mat'
temps_2021_10_15 = table2array(data(:,:));
load 'temps-2021-09-13.mat'
temps_2021_09_13 = table2array(data(:,:));
load 'temps-2021-09-29.mat'
temps_2021_09_29 = table2array(data(:,:));
load 'temps-2021-08-12.mat'
temps_2021_08_12 = table2array(data(:,:));
load 'temps-2021-07-27.mat'
temps_2021_07_27 = table2array(data(:,:));
load 'temps-2021-04-06.mat'
temps_2021_04_06 = table2array(data(:,:));
load 'temps-2021-03-21.mat'
temps_2021_03_21 = table2array(data(:,:));
load 'temps-2021-03-05.mat'
temps_2021_03_05 = table2array(data(:,:));
load 'temps-2021-02-17.mat'
temps_2021_02_17 = table2array(data(:,:));
Thank you so much!
  1 件のコメント
Stephen23
Stephen23 2022 年 7 月 11 日
編集済み: Stephen23 2022 年 7 月 11 日
temps_2021_02_17 = ..
% ^^^^^^^^^^ do not force meta-data into variable names
unless you really want to force yourself into writing slow, complex, inefficient, obfuscated, insecure, buggy code that is hard to debug:
Those files are so neatly designed with one variable name (i.e. 'data'), it really would be such a shame to awkwardly force meta-data into variable names. Indexing is simpler and much more efficient.

サインインしてコメントする。

採用された回答

Jon
Jon 2022 年 7 月 11 日
編集済み: Jon 2022 年 7 月 11 日
I agree with @Stephen23 comments about not using dynamically named variables, here's another approach, in which you store all of the data in a single table. You can then easily retrieve data corresponding to a particular date, as shown in the end of the example code,
% get list of relevant data files
list = dir('temps-*.mat')
% loop through data files saving data into tables
tableCell = cell(numel(list),1); % cell array to temporarily hold individual tables
for k = 1:numel(list)
load(list(k).name) % load the table
% find number of rows in the table
numRows = size(data,1);
% add new first column to table with date corresponding to source file name
[~,name] = fileparts(list(k).name)
date = datetime(name(7:end))
dateColumn = table(repmat(date,numRows,1),'VariableNames',{'date'});
data = [dateColumn data]
% put table into temporary cell array
tableCell{k}= data;
end
% concatenate table to make overall table
dataTable = vertcat(tableCell{:})
% now if for example you want an array of data corresponding to
% 2021-10-31 you can use
idl = dataTable.date == '2021-10-31'
data = table2array(dataTable(idl,2:end))
  4 件のコメント
Ashfaq Ahmed
Ashfaq Ahmed 2022 年 7 月 14 日
Thank you so much @Jon

サインインしてコメントする。

その他の回答 (1 件)

Stephen23
Stephen23 2022 年 7 月 11 日
編集済み: Stephen23 2022 年 7 月 11 日
A much better approach stores the imported data in the structure returned by DIR:
P = 'absolute or relative path to where the files are saved';
S = dir(fullfile(P,'*.mat'));
for k = 1:numel(S)
F = fullfile(P,S(k).name);
T = load(F);
S(k).data = table2array(T.data);
end
All of the imported data will be available in the structure S, for example the 2nd file:
S(2).name
S(2).data

カテゴリ

Find more on Operators and Elementary Operations in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by