将等式转化为代码

Translate an equation into a code

你能帮我把这个等式翻译成代码吗?

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

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

编辑:抱歉,我在胡思乱想。下面的答案没有对 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) 输出一个向量,适当调整元素操作)

IF M、K等都是矩阵,所有操作都希望是element-wise,那么这是一个这个等式的矢量化方法。

左求和为

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

这是矢量化的 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)