一次在矩阵中的多个范围上运行一个函数(在Matlab中)

时间:2013-08-01 20:40:26

标签: 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],:))

但这(显然)不起作用。

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

2 个答案:

答案 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 :(得分: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));