Агрегировать 3-е измерение трехмерного массива для индексов первого измерения - PullRequest
0 голосов
/ 01 октября 2011

У меня есть 3-х мерный массив Val размером 4xmx2. (м может быть переменной)

Val{1} = [1, 280; 2, 281; 3, 282; 4, 283; 5, 285];
Val{2} = [2, 179; 3, 180; 4, 181; 5, 182];
Val{3} = [2, 315; 4, 322; 5, 325];
Val{4} = [1, 95; 3, 97; 4, 99; 5, 101];

У меня есть индекс:

subs = {1,3,4};

Что я хочу получить в качестве выходных данных, так это среднее значение столбца 2 в вышеупомянутых 2D массивах (только 1,3 и 4), так что значение 1-го столбца равно> = 2 и <= 4. </p>

Выход будет: {282, 318,5, 98}

Вероятно, это можно сделать с помощью нескольких циклов, но просто интересно, есть ли более эффективный способ?

1 Ответ

0 голосов
/ 01 октября 2011

Вот одна строка:

output = cellfun(@(x)mean(x(:,1)>=2 & x(:,1)<=4,2),Val(cat(1,subs{:})),'UniformOutput',false);

Если subs является числовым массивом (не массивом ячеек), то есть subs=[1,3,4], и если output не обязательно должен быть массивом ячеек, но вместо этого может быть числовым массивом, т.е. *, то вышеизложенное упрощается до

output = cellfun(@(x)mean(x(x(:,1)>=2 & x(:,1)<=4,2)),Val(subs));

cellfun применяет функцию к каждому элементу массива ячеек, и индексирование обеспечивает усреднение только хороших строк.

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