快速逐列分组

时间:2015-05-22 11:37:19

标签: arrays matlab

假设 M N 是两个数组。在最简单的情况下,M和N是这样的:

  

1 14 7 80

     

2 15 8 12

     

3 16 9 11

(3行和4列)

我希望除以 1 所有三列,然后将列2除以所有三列,然后将列3除以全部三栏。

最快的方法是什么?(当然,使用for循环不是一个好的算法。)

修改

这是我的for循环代码:

idx = 1;
for i = 1 : size(N,2)
   for j = 1 : size(M,2)
       u(:,idx)=N(:,i) ./ M(:,j);
       idx = idx + 1;
   end
end

2 个答案:

答案 0 :(得分:5)

如何使用bsxfunpermute

假设MN相同且等于A

out = bsxfun(@rdivide, permute(A,[1 3 2]), A)

<强>输入:

A =

 1    14     7    80
 2    15     8    12
 3    16     9    11

您的样本输入结果:

out(:,:,1) =

1.0000    0.0714    0.1429    0.0125
1.0000    0.1333    0.2500    0.1667
1.0000    0.1875    0.3333    0.2727


out(:,:,2) =

14.0000    1.0000    2.0000    0.1750
7.5000    1.0000    1.8750    1.2500
5.3333    1.0000    1.7778    1.4545


out(:,:,3) =

7.0000    0.5000    1.0000    0.0875
4.0000    0.5333    1.0000    0.6667
3.0000    0.5625    1.0000    0.8182


out(:,:,4) =

80.0000    5.7143   11.4286    1.0000
6.0000    0.8000    1.5000    1.0000
3.6667    0.6875    1.2222    1.0000

答案 1 :(得分:3)

如果

A = [1 14 7 80

     2 15 8 12

     3 16 9 11]

然后

bsxfun(@ldivide, prod(A,2), A).*A

返回

ans =

    0.0001    0.0250    0.0062    0.8163
    0.0014    0.0781    0.0222    0.0500
    0.0019    0.0539    0.0170    0.0255

所以我的想法是将每个元素除以该行中的所有其他元素(即通过行的产品prod(A,2)),然后再乘以原始数字,这样就取消了你的事实被它除掉了(即最后的.*A)。因此上面的ans(2,3) 0.0222等于(8/(2*15*8*12))*8,其中(2*15*8*12)是第3行的乘积。

注意这会回答原始问题(即您描述的问题)并且 NOT 回答您的代码所暗示的问题