除元素本身之外的行中所有元素的平均值 - MATLAB

时间:2014-12-03 15:59:11

标签: matlab matrix calculated-columns

对于给定的矩阵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]

3 个答案:

答案 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数组,其中rc是{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可能更好。