将等式转换为代码

时间:2016-07-19 10:44:51

标签: matlab loops math formula

你能帮帮我吗请把这个等式翻译成代码吗? This is the equation

我尝试了这段代码,但它只是第一部分

theSum = sum(M(:, y) .* S(:, y) ./ (1 + K(:, y)))

3 个答案:

答案 0 :(得分:0)

编辑:对不起,我正在进行脑力训练。下面的答案没有假设M,K等的性质,这就是为什么我推荐这样的功能。但他们显然是矩阵。我会再做一个答案,我会把它留在这里作为参考,但万一它有用

我首先将MKXLO表达式转换为简单函数,以便您可以轻松调用它们为M(z,y)X(z,y)(或X(z,j),具体取决于您需要的输入)等。

然后,您将每个求和转换为for循环并收集结果(您可以稍后考虑向量化,现在专注于翻译问题)。双重求和本质上是一个嵌套的for循环,其中内部循环的结果在每个外部迭代中用于外部循环。

所以你的最终结果应该是这样的:

Summation1 = 0;
for z = 1 : Z
  tmp = M(z,y) / K(z,y) * (X(z,y) / (1 + L(z,y));
  Summation1 = Summation1 + tmp;
end

Summation2 = 0;
for j = 1 : Y
  if j ~= y
    for z = 1 : Z
      tmp = (M(z,j) * X(z,j) * O(j)) / (K(z,j)^2 * (1 + L(z,j)) * X(z,y);
      Summation2 = Summation2 + tmp;
    end
  end
end

Result = Summation1 - Summation2;

(顺便说一下,这假设所有操作都在标量上。如果M(z,y)输出一个向量,则适当调整元素运算)

答案 1 :(得分:0)

IF M,K等都是矩阵,所有操作都应该是逐个元素的,那么这是这个等式的矢量化方法。

左求和是

S1 = M(1:Z,y) ./ K(1:Z,y) .* X(1:Z,y) ./ (1 + L(1:Z,y));
S1 = sum(S1);

正确求和是(假设(O是水平向量)

S2 = M(1:Z, 1:Y) .* X(1:X, 1:Y) .* repmat(O(1:Y), [Z,1]) ./ ...
     (K(1:Z, 1:Y) .^ 2 .* (1 + L(1:Z, 1:Y))) .* X(1:Z, 1:Y);
S2(:,y) = [];   % remove the 'y' column from the matrix
S2 = sum(S2(:)); % add all elements

最终结果:S1 - S2

答案 2 :(得分:0)

这是lambda版本矢量化:

equation = @(y,M,K,X,L,O) ...
    sum(M(:,y)./K(:,y).*X(:,y)./(1+L(:,y))) ... 
    -sum(sum( ...
        bsxfun( ...
            @times ...
            ,M(:,[1:y-1,y+1:end]) ...
                .* X(:,[1:y-1,y+1:end]) ...
                .* O(:,[1:y-1,y+1:end]) ...
                ./ (K(:,[1:y-1,y+1:end]) .^ 2 ...
                .*(1+ L(:,[1:y-1,y+1:end]))) ...
            ,X(:,y) ...
        ) ...
    ));
%%% example:
y = 3;
Y = 5;
Z = 10;
M = rand(Y, Z);K = rand(Y, Z);X = rand(Y, Z);L = rand(Y, Z);O = rand(Y, Z);

equation(y,M,K,X,L,O)