Creating a multidimensional table
Afficher commentaires plus anciens
I'd like to create a multidimensional table. For example a 3D table with 10 stacked 3x3 matrices.
I tried with this code, but it doesn't work:
R = zeros(3,3,10);
T = table(R);
Thank you in advance.
8 commentaires
Walter Roberson
le 29 Déc 2018
If you mean a table with 3 or more index positions, then that is not supported. Nested tables are supported though.
Gennaro Arguzzi
le 30 Déc 2018
Walter Roberson
le 30 Déc 2018
? That example just has a numeric array and a cell array
data = data_statics(:); label = label_statics(:);
table(data, 'rownames', label)
Gennaro Arguzzi
le 30 Déc 2018
Walter Roberson
le 31 Déc 2018
Modifié(e) : Walter Roberson
le 31 Déc 2018
T1 = table(data_statics);
T2 = table(label_statics);
T = table(T1,T2);
T =
1×2 table
T1 T2
data_statics label_statics
______________ _____________
[1x138 double] [1x138 cell]
But you might prefer
data_statics = data_statics(:);
label_statics = label_statics(:);
data_statics_table = table(data_statics);
label_statics_table = table(label_statics);
T = table(data_statics_table, label_statics_table);
It hardly seems worth putting each variable in its own table, though.
Gennaro Arguzzi
le 31 Déc 2018
Modifié(e) : Gennaro Arguzzi
le 31 Déc 2018
Benjamin Azrieli
le 12 Nov 2020
@WalterRobinson If I wanted to access a certain range in the double under one of the variables, how would I do so using your example? This page does not seems to help: https://www.mathworks.com/help/matlab/matlab_prog/access-data-in-a-table.html
Benjamin Azrieli
le 12 Nov 2020
In case anyone wants to know, I figured it out:
T.data_statistics(row #, n, m) , where n and m are the row and column dimensions, respectively, of the double under the variable name 'data_statistics'
Réponses (3)
per isakson
le 29 Déc 2018
With R2018b
>> R = zeros(3,3,10);
>> T = table(R);
>> T
T =
3×1 table
R
_______________
[1x3x10 double]
[1x3x10 double]
[1x3x10 double]
>>
What do you mean by "it doesn't work"
8 commentaires
Gennaro Arguzzi
le 30 Déc 2018
per isakson
le 30 Déc 2018
Modifié(e) : per isakson
le 30 Déc 2018
"multidimensional table" in Matlab would be an array of tables, but that is not supported.
Matlab supports tables with tables as values of variables
>> T = table(T2,T3)
T =
3×2 table
T2 T3
____________ ____________
[1x10 table] [1x10 table]
[1x10 table] [1x10 table]
[1x10 table] [1x10 table]
and cell arrays of tables.
Gennaro Arguzzi
le 30 Déc 2018
per isakson
le 30 Déc 2018
Modifié(e) : per isakson
le 30 Déc 2018
I actually did download it, but failed to figure out how it supports your question. See Walters comment
per isakson
le 30 Déc 2018
Modifié(e) : per isakson
le 31 Déc 2018
I've deleted this comment because it contained too many mistakes on my part.
New try with R2018b
%%
T1 = table( ones(3,1) );
T2 = table( 2*ones(3,1) );
T = table( T1, T2 )
returns
T =
3×2 table
T1 T2
Var1 Var1
____ ____
1 2
1 2
1 2
Walter Roberson
le 31 Déc 2018
T2 = mergevars(___,'MergeAsTable',true) merges the specified variables into a table, instead of an array. The new table is itself a variable of the output table T2.
So, Yes, you can have tables as variables inside a table.
per isakson
le 31 Déc 2018
Modifié(e) : per isakson
le 31 Déc 2018
mergevars was "Introduced in R2018a."
I learn a lot tonight :)
Walter Roberson
le 31 Déc 2018
R2015b experiment:
>> load data_statics
>> T1 = table(data_statics);
T2 = table(label_statics);
T = table(T1,T2);
>> T
T =
T1 T2
___________ ___________
[1x1 table] [1x1 table]
Mike D.
le 9 Juil 2019
0 votes
T = table(T1,T2,T3) only works if all three tables have exactly the same number of columns AND exactly the same number of rows, and all columns are the same data type. If I had a 1000 tables, it would be nice if Matlab could index them:
T(1) = T1;
T(2) = T2;
for i = 1:1000
T(i) = readtable(sprintf('file%d.dat', i), opts);
end
1 commentaire
Walter Roberson
le 9 Juil 2019
Use cell array.
T = cell(1000,1);
T{1} = T1;
T{2} = T2;
for i = 1:1000
T{i} = readtable(sprintf('file%d.dat', i), opts);
end
Remember that for tables, the syntax T(i) is a shortcut for T{:,i} so for arrays of tables T(i) would be an ambiguous syntax unless arrays of tables were a different datatype.
Mike D.
le 9 Juil 2019
Works great, thanks. When I plot all thousand tables, each having thousands of rows and multiple columns, I couldn't do it with a one-liner such as:
plot(T{:}{:,1},T{:}{:,2})
Instead, I had to use a for-loop:
for i = 1 : numel(T)
plot(T{i}{:,1},T{i}{:,2})
plot(T{i}.Longitude, T{i}.Latitude)
end
But it works, thanks.
1 commentaire
Walter Roberson
le 9 Juil 2019
You can use cellfun.
hold on
cellfun(@(t) plot(t.Longitude, t.Latitude), T);
Catégories
En savoir plus sur Multidimensional Arrays dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!