假设 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
答案 0 :(得分:5)
假设M
和N
相同且等于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 回答您的代码所暗示的问题