Логическая маскировка в Matlab - Как (мгновенно) индексировать объединенный массив Matlab? - PullRequest
0 голосов
/ 13 июня 2019

Структура данных:

У меня есть массив struct s с несколькими полями s.x, s.y и s.z.Обратите внимание на следующие свойства структуры struct!:

(1) Поля в одной строке имеют одинаковые векторы одинакового размера:

length(s(i).x)=length(s(i).y)=length(s(i).z)

(2) Одиночные векторы в полях могут различаться вразмер в строках:

length(s(i).x)~=length(s(j).x)
length(s(i).y)~=length(s(j).y)
length(s(i).z)~=length(s(j).z)

Проблема:

Я хотел бы создать логическую маску на основе одного из полей, например, s.z, и применить ее ко всей структуремассив.Один из способов - сделать следующее:

mask = [s.z] > 0;
s_concatenated = [s.x; s.y; s.z]';
mask_applied2struct = s_concatenated(mask);

Теперь у меня вопрос: есть ли способ применить логическую маску к типу данных структуры в Matlab? Возможно, в следующем режиме,Например:

mask_applied2struct = s([s.z] > 0)

или

mask_applied2struct = [s]([s.z] > 0)

Итак, в основном меня интересует мгновенный способ объединения структуры и применения к ней маски.

Спасибо зазаранее!

1 Ответ

4 голосов
/ 13 июня 2019

Вы можете использовать structfun, чтобы применить функцию к каждому полю вашей структуры.structfun в основном скрытый цикл.

Пример:

%random structure with size(x) = size(y) = size(z)
s.x = round(rand(4,4)*2-1);
s.y = round(rand(4,4)*2-1);
s.z = round(rand(4,4)*2-1);

%create a logical mask
mask = s.x>=0;

%apply the mask to each field
s_new = structfun(@(p) p(mask),s,'UniformOutput',0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...