你能帮帮我吗请把这个等式翻译成代码吗?
我尝试了这段代码,但它只是第一部分
theSum = sum(M(:, y) .* S(:, y) ./ (1 + K(:, y)))
答案 0 :(得分:0)
编辑:对不起,我正在进行脑力训练。下面的答案没有假设M,K等的性质,这就是为什么我推荐这样的功能。但他们显然是矩阵。我会再做一个答案,我会把它留在这里作为参考,但万一它有用
我首先将M
,K
,X
,L
和O
表达式转换为简单函数,以便您可以轻松调用它们为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)