有约束时如何省略for循环

时间:2014-04-16 06:52:22

标签: matlab for-loop

我有以下两个数组:

A = [1 2;3 4] and B = [1 5 4]

我想做以下操作:

for each element of A(call it A(i))
    for each element of B~=b do
        ( (A(i) - 1)/(b-1) ) * ( (A(i) - 5)/(b-5) ) * ( (A(i)- 4)/(b-4) )
    end
end

这意味着,有时分子等于零,因此产品应为零。我想对B的元素进行操作,这些元素不等于分母中的b而不是Inf

如何为整个矩阵A而不是使用for循环执行此操作?

2 个答案:

答案 0 :(得分:1)

<强>代码

A = [1 2;3 4];
B = [1 5 4];

m1 = bsxfun(@minus,A,permute([1 5 4],[3 1 2]));
m2 = bsxfun(@minus,B,permute([1 5 4],[3 1 2]));

for k1=1:size(A,1)
    for k2=1:size(A,2)
        t2 = squeeze(bsxfun(@rdivide,m1(k1,k2,:),m2));
        t2(1:size(t2,1)+1:end)=1;
        A1(k1,k2) = prod(t2(:)); %%// Output
    end
end

<强>输出

A1 =

         0   -0.2500
   -0.1111         0

您可以删除嵌套循环,但至少有两个问题 -

  1. 您将使用bsxfun使用它进入第4和第5维。所以,调试会很困难。
  2. 据我所知,
  3. bsxfun的维度越来越慢。

答案 1 :(得分:0)

您可以执行操作,稍后再更正:

C = (A-1)./(B-1) .* (A-5)./(B-5) .* (A-4)./(B-4)
C(isinf(C)) = 0;

C(B==b) = 0;

可能你需要bsxfun,我不清楚你想要的输出大小......