Deleting certain elements from an array without looping

7 visualizaciones (últimos 30 días)
Teshan Rezel
Teshan Rezel el 8 de Nov. de 2021
Respondida: Rik el 8 de Nov. de 2021
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 comentarios
Chunru
Chunru el 8 de Nov. de 2021
Can you provide a small part of fileNames so we know what it looks like?
Teshan Rezel
Teshan Rezel el 8 de Nov. de 2021
@Rik apologies, I'll ammend my question to include this!

Iniciar sesión para comentar.

Respuesta aceptada

Rik
Rik el 8 de Nov. de 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'}
fileNames = 1×2 cell array
{'ThisIsADummyFile'} {'012345678901234567891'}
idx = cellfun('prodofsize', fileNames)~=21
idx = 1×2 logical array
1 0
fileNames(idx) =[]
fileNames = 1×1 cell array
{'012345678901234567891'}
You can also use idx to remove elements of the struct that dir returned.

Más respuestas (1)

Chunru
Chunru el 8 de Nov. de 2021
fileNames = {'ThisIsADummyFile', '012345678901234567891'}
fileNames = 1×2 cell array
{'ThisIsADummyFile'} {'012345678901234567891'}
idx = cellfun(@(x) length(x)~=21, fileNames)
idx = 1×2 logical array
1 0
fileNames(idx) =[]
fileNames = 1×1 cell array
{'012345678901234567891'}

Categorías

Más información sobre File Operations en Help Center y File Exchange.

Productos


Versión

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by