Фильтрация данных нечислового массива MATLAB на основе критериев - PullRequest
1 голос
/ 19 июня 2019

Два вопроса, один довольно простой вопрос (по крайней мере, кажется, что он должен быть простым) и тот, который может занять немного больше работы.Не стесняйтесь вносить вклад в одно или оба.

Сначала я бы хотел создать массив строк на основе существующего массива строк на основе критериев.Возьмем, к примеру, аналогичную операцию с двойным массивом:

>> nums = [ 1 2 1 2]

nums =

     1     2     1     2

>> big_nums = (nums == 2) .* nums

big_nums =

     0     2     0     2

Я хотел бы сделать нечто подобное с массивом строк, однако я не знаю, какую функцию использовать:

>> sizes = ["XL" "L" "XL" "L"]

sizes = 

  1×4 string array

    "XL"    "L"    "XL"    "L"

>> large_sizes = (sizes == "L") .* sizes
Undefined operator '.*' for input arguments of type 'string'.

Я бы хотел, чтобы результат был

large_sizes = 

  1×4 string array

    ""    "L"    ""    "L"

Второй вопрос.Предположим, у меня есть двумерный массив ячеек.Я хотел бы отфильтровать данные по критериям:

>> data = {"winter", 1; "spring", 2; "summer", 3; "fall", 4}

data =

  4×2 cell array

    ["winter"]    [1]
    ["spring"]    [2]
    ["summer"]    [3]
    ["fall"  ]    [4]

>> nice_weather = ( (data(1,:) == "fall") + (data(1,:) == "spring") ) .* data
Error using  == 
Cell must be a cell array of character vectors.

Мне нужен код, который приводит к одному из двух массивов: nice_weather =

  4×2 cell array

    [""]          [1]
    ["spring"]    [2]
    [""]          [3]
    ["fall"]      [4]

-----ИЛИ -----

nice_weather =

  2×2 cell array

    ["spring"]    [2]
    ["fall"]      [4]

В этом вопросе я также открыт для разделения данных на несколько массивов (например, один массив для строк и один массив для чисел).

Спасибо!

1 Ответ

1 голос
/ 19 июня 2019

В этом решении используется функция strcmpi из MATLAB ( набор инструментов не требуется ) для сравнения двух строк (без учета регистра).

1D Cell Array:

sizes = {'XL' 'L' 'XL' 'L'};    % Changed " to ' & used cell array
idx = strcmpi(sizes,'L');       % Logical index
sizelist = {sizes{idx}}

Или вы можете попробовать что-то вроде
sizes(~idx) = {"" ""} % manual just for example

Для этого, чтобы автоматически настроить количество пропусков "", вы можете использовать repmat, как это sizes(~idx) = repmat({""},1,sum(~idx))

Вывод:

размеры = 1 × 4 массива ячеек
{[""]} {'L'} {[""]} {'L'}

2D Cell Array:

data = {'winter', 1; 'spring', 2; 'summer', 3; 'fall', 4};   % Changed " to '
nicemo1 = 'spring';   
nicemo2 = 'fall';

idx = strcmpi(data(:,1),nicemo1) | strcmp(data(:,1),nicemo2);  % Obtain logical index
data(idx,:)

Выход:

ans = 2 × 2 массива ячеек
{'spring'} {[2]}
{'fall'} {[4]}


Протестировано с MATLAB R2018b.
Также остерегайтесь таких переменных, как sizes, поскольку удаление буквы маскирует полезную функцию, size.

...