2011-10-01 91 views
0

我有一个3维数组Val 4xmx2维。 (m可以是可变的)第一维下标的3d数组的集合第三维

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列中的平均上述二维阵列(仅1,3的4),使得第一列值大于等于2且< = 4。

输出将是: {282,318.5,98}

这或许可以通过使用几个循环,只是不知道是否有更有效的方法呢?

回答

0

这里的一个单行:

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适用于单元阵列的每个元件的功能,并且所述分度可确保只有好的行是平均。

+0

辉煌的东西。对我来说很完美。非常感谢。 – sdhrm

+0

@sdhrm:如果您发现我的答案有用,请考虑接受它。 – Jonas

+0

@乔纳斯:当然,我会这么做的。还有一件事我想问。如果Val {3}是一个空向量,则该代码将引发错误:? ??试图访问x(:,1);索引超出范围,因为size(x)= [0,0]。你知道我们如何摆脱这个错误,打印NaN而不是抛出错误 – sdhrm

相关问题