Удаление суффикса из всех элементов массива строковых ячеек

#matlab

#matlab

Вопрос:

У меня есть массив ячеек, содержащий строки, с именем old_array . Каждый элемент заканчивается суффиксом ‘.dat’. Я хочу создать новый массив ячеек с именем new_array , который содержит те же элементы, но без этого суффикса.

Я знаю, что существует следующая функция:

 [new_array] = arrayfun(func, old_array)
  

Но для чего я использую func ? Я думал об использовании strsplit(str, '.') и взятии первого элемента этого массива, что-то вроде:

 [new_array] = arrayfun(strsplit(*, '.')[0], old_array)
  

Но что мне поместить вместо * ? Какое лучшее решение?

Комментарии:

1. У вас почти получилось. Я подготовил для вас ответ.

Ответ №1:

Если каждый элемент в вашем массиве заканчивается на .dat , почему бы вам просто не извлечь все символы, кроме последних 4, для каждой строки в вашем массиве ячеек?

 new_array = cellfun(@(x) x(1:end-4), old_array, 'UniformOutput', false);
  

Это должно вернуть новый массив ячеек, хранящийся в new_array , где каждый элемент теряет последние 4 символа каждой строки из массива ячеек old_array , который является строкой .dat для каждой строки в old_array .


Однако, если вы хотите сделать это более надежным и если вы хотите разместить любое имя файла, вы можете использовать strsplit то, что у вас есть в вашем сообщении. Вам пришлось бы структурировать его следующим образом:

 %// Use to split up the strings for each cell and store in individual cells
new_array_temp = cellfun(@(x) strsplit(x, '.'), old_array, 'UniformOutput', false);
%// Extract the first cell of each nested cell
new_array = cellfun(@(x) x{1}, new_array_temp, 'UniformOutput', false);
  

Нам нужно выполнить первый шаг, чтобы мы могли вернуть массив ячеек cell. Каждая вложенная ячейка в большем массиве ячеек будет содержать строки, которые разделяются . внутри элемента вложенной ячейки. Затем вы запускаете следующую команду, чтобы мы извлекли первую строку каждой вложенной ячейки, которая является самим именем файла перед . .

Вот пример, который показывает вам, как это выполняется, а также промежуточные результаты:

 old_array = {'Hi.dat', 'how.dat', 'are.dat', 'you.dat'};

new_array_temp = cellfun(@(x) strsplit(x, '.'), old_array, 'UniformOutput', false);
celldisp(new_array_temp);

new_array_temp{1}{1} =

Hi


new_array_temp{1}{2} =

dat


new_array_temp{2}{1} =

how


new_array_temp{2}{2} =

dat


new_array_temp{3}{1} =

are


new_array_temp{3}{2} =

dat


new_array_temp{4}{1} =

you


new_array_temp{4}{2} =

dat
  

 new_array = cellfun(@(x) x{1}, new_array_temp, 'UniformOutput', false);
disp(new_array);

 'Hi'    'how'    'are'    'you'
  

Незначительное примечание

Примечание: strsplit работает только для MATLAB R2013a и выше. Если вы хотите, чтобы это работало с предыдущими версиями MATLAB, используйте regexp . Замените strsplit вызов внутри cellfun этим:

 new_array_temp = cellfun(@(x) regexp(x, '.', 'split'), 'UniformOutput', false);
  

Это должно в основном привести к тому же, что и strsplit . Однако, если вы действительно, очень, очень, очень хотите использовать strsplit , в MathWorks File Exchange есть реализация: http://www.mathworks.com/matlabcentral/fileexchange/21710-string-toolkits/content/strings/strsplit.m