Effacer les filtres
Effacer les filtres

Is it possible to use vertcat with dot notation?

2 vues (au cours des 30 derniers jours)
Sim
Sim le 13 Déc 2022
Commenté : Sim le 14 Déc 2022
EDITED Is it possible to use vertcat with dot notation?
This is an example once I extract names from Excel files contained in a folder:
%input
filename = dir(fullfile(directory,'*file*'));
% output
>> filename
filename =
3×1 struct array with fields:
name
folder
date
bytes
isdir
datenum
>> filename.name
ans =
'file_1.xlsx'
ans =
'file_2.xlsx'
ans =
'file_3.xlsx'
% try to concatenate vertically the three files' names
>> vertcat(filename{:}.name)
Brace indexing is not supported for variables of this type.
  7 commentaires
Jiri Hajek
Jiri Hajek le 13 Déc 2022
Ok, you can put the names into a single variable, but considering the number of characters in each may be different, the most natural choice is cell array (column):
fileNameColumn = {filename.name}';
Sim
Sim le 13 Déc 2022
I am extremely thankful to all of you @Jiri Hajek @DGM @Jonas @Stephen23 for your comments (cool explanation @Stephen23!).... and at the same time, really sorry for my very silly question.... I did not think at all about {filename.name}... sorry! (In any case, if any of you wants to put your comments in the Answer section I will accept it with pleasure :-) )

Connectez-vous pour commenter.

Réponse acceptée

Stephen23
Stephen23 le 13 Déc 2022
Déplacé(e) : Stephen23 le 13 Déc 2022
"The error is being caused by the fact that filename is not a struct."
FILENAME is a struct (as returned by DIR). Curly brace indexing is not defined for structures (see the error message).
"Is it possible to use vertcat with dot notation?"
Of course, you can use any comma-separated list as the inputs to VERTCAT:
S = struct('X',{'hello','world'}) % content have same number of columns...
S = 1×2 struct array with fields:
X
vertcat(S.X) % so VERTCAT is possible but fragile. Creates a character matrix.
ans = 2×5 char array
'hello' 'world'
But I would not recommend it because it is very fragile code: using VERTCAT on the structure from DIR() assumes that all of the filenames have exactly the same length, otherwise your code will throw an error:
S = struct('X',{'a','bcd'}) % content have different number of columns...
S = 1×2 struct array with fields:
X
vertcat(S.X) % which is why VERTCAT is a bad approach.
Error using vertcat
Dimensions of arrays being concatenated are not consistent.
As Jonas correctly wrote, you should probably use a cell array: {filename.name}
Or, simply refer directly to the content of the structure array.
  1 commentaire
Sim
Sim le 14 Déc 2022
Thanks to all of you for your precious contribution @Stephen23, @Jonas, @Peter Perkins, @Jiri Hajek, @DGM.
Personally, I would have accepted all your answers/comments, but there is only the possibility to accept one. :-)
@MathWorks Support Team I think it might be nice (just an idea/suggestion) to have the possibility to accept multiple answers in some cases. :-)

Connectez-vous pour commenter.

Plus de réponses (2)

Peter Perkins
Peter Perkins le 13 Déc 2022
Depending on what you are doing, you may find it convenient to turn that struct into a table (which wil automatically vertcat the file names for you):
s = dir
s = 2×1 struct array with fields:
name folder date bytes isdir datenum
t = struct2table(s)
t = 2×6 table
name folder date bytes isdir datenum ______ ____________________________ ________________________ _____ _____ __________ {'.' } {'/users/mss.system.cHQNIJ'} {'13-Dec-2022 16:06:16'} 0 true 7.3887e+05 {'..'} {'/users/mss.system.cHQNIJ'} {'13-Dec-2022 16:06:16'} 0 true 7.3887e+05
  2 commentaires
Stephen23
Stephen23 le 13 Déc 2022
Modifié(e) : Stephen23 le 13 Déc 2022
"which wil automatically vertcat the file names for you"
Strictly speaking it creates a cell array of character arrays, rather than vertical concatenation of the field content:
S = dir();
T = struct2table(S)
T = 2×6 table
name folder date bytes isdir datenum ______ ____________________________ ________________________ _____ _____ __________ {'.' } {'/users/mss.system.rBKUO2'} {'13-Dec-2022 16:16:37'} 0 true 7.3887e+05 {'..'} {'/users/mss.system.rBKUO2'} {'13-Dec-2022 16:16:37'} 0 true 7.3887e+05
T.name % cell array, not vertical concatenation of char vectors.
ans = 2×1 cell array
{'.' } {'..'}
Sim
Sim le 14 Déc 2022
Thanks to all of you for your precious contribution @Stephen23, @Jonas, @Peter Perkins, @Jiri Hajek, @DGM.
Personally, I would have accepted all your answers/comments, but there is only the possibility to accept one. :-)
@MathWorks Support Team I think it might be nice (just an idea/suggestion) to have the possibility to accept multiple answers in some cases. :-)

Connectez-vous pour commenter.


Jonas
Jonas le 14 Déc 2022
if you just want to have all file names available, you could use { }
e.g. in a cell array
{filename.name}
if you do not need further information from the dir out beside the name, you could also abbreviate it to one line
{dir(fullfile(directory,'*file*')).name}
  1 commentaire
Sim
Sim le 14 Déc 2022
Thanks to all of you for your precious contribution @Stephen23, @Jonas, @Peter Perkins, @Jiri Hajek, @DGM.
Personally, I would have accepted all your answers/comments, but there is only the possibility to accept one. :-)
@MathWorks Support Team I think it might be nice (just an idea/suggestion) to have the possibility to accept multiple answers in some cases. :-)

Connectez-vous pour commenter.

Catégories

En savoir plus sur Dates and Time dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by