对于给定的矩阵A,如何创建相同大小的矩阵B,其中每列是所有其他列的平均值(或任何其他函数)?
例如:
上的一个功能A = [
1 1 1
2 3 4
4 5 6]
应该导致
B = [
1 1 1
3.5 3 2.5
5.5 5 4.5]
答案 0 :(得分:6)
bsxfun
-
B = bsxfun(@minus,sum(A,2),A)./(size(A,2)-1)
<强>鉴于强>
>> A
A =
1 1 1
2 3 4
4 5 6
步骤1:对于A中的每个元素,计算除元素本身之外的所有元素的总和 -
>> bsxfun(@minus,sum(A,2),A)
ans =
2 2 2
7 6 5
11 10 9
步骤2:将每个元素结果除以负责求和的元素数量,即number of columns minus 1
,即(size(A,2)-1)
-
>> bsxfun(@minus,sum(A,2),A)./(size(A,2)-1)
ans =
1.0000 1.0000 1.0000
3.5000 3.0000 2.5000
5.5000 5.0000 4.5000
答案 1 :(得分:4)
使用您的示例:
[m,n]=size(A);
B=zeros(m,n);
for k=1:n
B(:,k) = mean(A(:,[1:k-1 k+1:end]),2);
end
它可能不像@Divakar的答案那么快或有效,但由于更好的可读性,我倾向于选择for
循环。它还可以更容易地从mean
调用不同的函数。
答案 2 :(得分:3)
对于任意函数,如果您不介意使用更多内存,则可以使用矢量化方法。具体而言,这需要生成大小为r
x c
x c
的3D数组,其中r
和c
是{A
的行数和列数1}}。
f = @(x) prod(x,2); %// any function which operates on columns
c = size(A,2); %// number of columns
B = repmat(A, [1 1 c]);
B(:,1:c+1:end) = []; %// remove a different column in each 3D-layer
B = reshape(B, [], c-1, c); %// each 3D-layer of B contains a set of c-1 columns
result = f(B); %// apply function
result = squeeze(result); %// remove singleton dimension
正如Divakar在评论中指出的那样,匿名函数往往会减慢速度。在文件中定义函数f
可能更好。