我有以下矩阵:
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],:))
但这(显然)不起作用。
我可以使用循环来做到这一点,但我想知道是否有一个不涉及循环的解决方案?
答案 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)
使用bsxfun
和reshape
来计算索引数组然后计算差异可能会有点创意:
n = 3;
idx = bsxfun(@plus, 1:size(MatrixA, 1) - n + 1, (0:n - 1)');
B = reshape(var(reshape(MatrixA(idx, :), 3, [])), [], size(MatrixA, 2));