2013-08-01 160 views
0

上运行多个范围的函数一次我有以下矩阵:以矩阵(在Matlab)

MatrixA = 
    1 10 50 
    23 45 76 
    71 81 91 
    1  2  3 
    4  5  6 
    78 89 91 
    2  3  4 

我想运行在每个列中的多个范围中的var功能。更具体地说,我想为每列的第1行到第3行,第2行到第4行,第3行到第5行等计算var。我想输出是:

1281.33 1260.33 430.33 
1281.33 1564.33 2216.33 
1566.33 2004.33 2496.33 
    ...  ...  ... 

我想语法将沿着线的东西:

var(MatrixA([1 2 3]:[3 4 5],:)) 

但(显然)不工作。

我可以使用循环做到这一点,但我想知道是否有解决方案,这不涉及循环?

+3

如果'var'功能开启MatrixA'的'逐元素函数的线性变换,则可以高效地实现此作为有限脉冲响应滤波器。否则,你可能需要一个循环。 –

+2

还要注意,MATLAB中的循环并不慢,慢的是执行大量不同的(非矢量化的)操作。因此,即使避免了显式循环,'arrayfun'风格的东西也不会帮助性能。你似乎想多次调用'var' ......循环和其他任何方式一样快。 –

+0

然后是一个循环。谢谢! –

回答

1

可以使用hankel函数来创建范围干掉一个循环:

V = []; 
for C = MatrixA, 
    V = [V, var(hankel(C(1:3),C(3:end))).']; 
end 

例如,如果C包含MatrixA第一列然后

>> hankel(C(1:3),C(3:end)) 
ans = 
    1 23 71  1  4 
    23 71  1  4 78 
    71  1  4 78  2 

>> var(hankel(C(1:3),C(3:end))) 
ans = 
     1281.3  1281.3  1566.3  1902.3   1876 
1

你可能是一个小小的创造者与bsxfunreshape香港专业教育学院来计算索引阵列,然后计算方差:

n = 3; 
idx = bsxfun(@plus, 1:size(MatrixA, 1) - n + 1, (0:n - 1)'); 
B = reshape(var(reshape(MatrixA(idx, :), 3, [])), [], size(MatrixA, 2));