我有一个3维数组Val 4xmx2维度。(m可为变量)
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};
我想要得到的输出是上述2D数组(只有1,3和4)中第2列的平均值,使得第1列的值>=2和<=4。
输出将是:{282,318.5, 98}
这可能可以通过使用几个循环来完成,但只是想知道是否有更有效的方法?
下面是一行代码:
output = cellfun(@(x)mean(x(:,1)>=2 & x(:,1)<=4,2),Val(cat(1,subs{:})),'UniformOutput',false);
如果subs
是数值数组(不是单元格数组),即subs=[1,3,4]
,如果output
不一定是单元格数组,但可以是数值数组,即output = [282,318.5,98]
,则上述化简为
output = cellfun(@(x)mean(x(x(:,1)>=2 & x(:,1)<=4,2)),Val(subs));
cellfun
对单元格数组的每个元素应用一个函数,并且索引确保只对好的行取平均值。