假设A是如下所示的三维矩阵(2行-2列-2页)。
A(:,:,1)=[1,2;3,4];
A(:,:,2)=[5,6;7,8];
我想要一个向量,比如"a",它的输入是每页矩阵对角线元素的平均值。在这个简单的例子中,a=[(1+4)/2;(5+8)/2]
但我有困难在matlab中这样做。我尝试了下面的代码,但失败了。
mean(A(1,1,:),A(2,2,:))
您可以在定义对角线的两个维度中使用"部分线性索引",如下所示:
- 由于部分线性索引只能应用于尾维,所以首先需要应用
permute
来重新排列维度,使第一个和第二个维度成为第二个和第三个维度。 - 现在你保持第一个维度不变,线性索引的对角线在第二个和第三个维度(这有效地减少了这两个维度为一个),并应用
mean
沿(合并)第二个维度。
B = permute(A, [3 1 2]); %// step 1: permute
result = mean(B(:,1:size(A,1)+1:size(A,1)*size(A,2)), 2); %// step 2: index and mean
在你的例子中,
A(:,:,1)=[1,2;3,4];
A(:,:,2)=[5,6;7,8];
这给
result =
2.5000
6.5000
您可以使用bsxfun
作为通用解决方案-
[m,n,r] = size(A)
mean(A(bsxfun(@plus,[1:n+1:n^2]',[0:r-1]*m*n)),1)
示例运行-
>> A
A(:,:,1) =
8 4 1
7 6 3
1 5 8
A(:,:,2) =
1 7 6
8 5 2
1 2 7
A(:,:,3) =
6 2 8
1 1 6
1 4 5
A(:,:,4) =
8 1 6
1 5 1
9 2 7
>> [m,n,r] = size(A);
>> sum(A(bsxfun(@plus,[1:n+1:n^2]',[0:r-1]*m*n)),1)
ans =
22 13 12 20
>> mean(A(bsxfun(@plus,[1:n+1:n^2]',[0:r-1]*m*n)),1)
ans =
7.3333 4.3333 4 6.6667