Октава: есть ли способ поиска элементов в массиве ячеек, содержащем скалярную структуру с полями и как определить условия - PullRequest
0 голосов
/ 11 марта 2020

У меня есть этот массив в октаве:

dwnSuccess(1,1)
ans =
{
  [1,1] =

    scalar structure containing the fields:

      site = FRED
      interval = d
      aard = logDir log/
      dwnGrootte =  log/
      time =  737861.64028

, и я хотел бы сформулировать условия для поиска ячеек, содержащих, например, logDir в поле 'aard'. Я не нахожу правильный синтаксис. Кто-то знает, где найти или есть пример с комбинациями условий. Спасибо

Ответы [ 2 ]

1 голос
/ 11 марта 2020

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

aards = cellfun (@getfield, cs, {"aard"}, "UniformOutput", false);
m = strcmp(aards, "logDir"); # this must match the whole string
filter_cs2 = cs(m); 

Если вам интересно узнать, находится ли строка где-то в этом поле, то это немного сложнее:

m = ! cellfun ("isempty", strfind (aards, "logDir"));
0 голосов
/ 11 марта 2020

Если я правильно понял ваш вопрос, то предположим, что у вас есть следующий массив ячеек:

a = cell();
a{1} = struct('a', 1, 'b', 'dwn', 'c', 2);
a{2} = struct('a', 2, 'b', 'notdwn', 'c', 3);
a{3} = struct('a', 3, 'b', 'dwn', 'c', 4);
a{4} = struct('a', 4, 'b', 'dwn', 'c', 5);

Я думаю, что проще всего было бы сначала преобразовать его в массив структуры. Вы можете сделать это легко с помощью синтаксиса «генератора последовательностей», то есть

s = [a{:}];   % collect all cell elements as a sequence, then wrap into an array

. Если вы отвечаете за этот код, то вместо этого я бы просто создал структурный массив вместо массива ячеек с самого начала.

Как только вы это сделаете, вы снова можете использовать синтаксис «генератора последовательностей» в массиве struct с соответствующей функцией, которая проверяет равенство. В вашем случае вы могли бы сделать что-то вроде этого:

strcmp( {s.b}, 'dwn' )
% ans = 1  0  1  1

s.b обращается к полю 'b' в каждом элементе массива структуры, возвращая его в виде списка через запятую. Заключение в скобки приводит к тому, что эта последовательность становится массивом ячеек. Затем вы передаете полученный массив ячеек строк в strcmp, чтобы сравнить каждый элемент со строкой 'dwn'.

В зависимости от того, что вы хотите сделать дальше, вы можете использовать этот логический массив в качестве индекса для вашей структуры. массив, чтобы изолировать только структуры, которые содержат это значение et c.

Очевидно, что это быстрый способ сделать это, если вы можете создавать последовательности таким образом. Если нет, общая идея остается в силе, и вы можете повторить, используя традиционный цикл for et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...