#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