Deleting certain elements from an array without looping
3 views (last 30 days)
Show older comments
Hi folks,
I have a cell array containing all the file names in a subfolder. I want to remove the filenames that are not 21 characters in length.
I have tried:
fileNames(length(fileNames(:)) ~= 21) = [];
but this only deletes one entry each time I run it, and not the correct ones eather!
May I please ask where I've gone wrong and how to fix it?
full code:
subFolders = dir(sourcePath);
subFolders = subFolders([subFolders(:).isdir]);
subFolders = subFolders(~ismember({subFolders(:).name},{'.','..'}));
fileNum = numel(subFolders);
folderDir = fullfile(subFolders(i).folder, subFolders(i).name);
folderDir = dir(folderDir);
folderDir = folderDir(~ismember({folderDir(:).name},{'.','..'}));
fileNames = {folderDir.name};
Thanks!
3 Comments
Accepted Answer
Rik
on 8 Nov 2021
The code Chunru wrote will work, but I have a few suggestions.
Instead of using length, you should consider using numel as a habit. In this case dir will alway provide you with vectors, but there is no situation I know of where length is a better choice than either numel or size. I have never seen a non-contrived example where max(size(A)) was actually the intended behavior.
I would also like to point you to the legacy syntax of cellfun, which is the main (or only) situation where cellfun is faster than a loop:
fileNames = {'ThisIsADummyFile', '012345678901234567891'}
idx = cellfun('prodofsize', fileNames)~=21
fileNames(idx) =[]
You can also use idx to remove elements of the struct that dir returned.
0 Comments
More Answers (1)
Chunru
on 8 Nov 2021
fileNames = {'ThisIsADummyFile', '012345678901234567891'}
idx = cellfun(@(x) length(x)~=21, fileNames)
fileNames(idx) =[]
0 Comments
See Also
Categories
Find more on Matrix Indexing 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!