我是 matlab 的初学者,我想计算从不同行选取的 (3*n) 矩阵元素的每种可能组合的乘积之和。
例如,如果矩阵是 x = [1 2 3 , 4 5 6] 我想要的结果 D = 1*4 + 1*5 + 1*6 + 2*4 + 2*5 + 2*6 + 3*4 + 3*5 + 3*6。
我编写了以下递归代码,但在通过引用传递变量时遇到问题。
function combination(n,A,x) % n= number of rows ,A= empty array, x = the matrix
if n == 0
D = D + prod(A);
else
for i = 1:1:3
A = [A x(n,i)];
combination(n-1,A,x);
if length(A)>=1
A = A(1:length(A)-1);
end
end
end
end
我需要 D 参数,但是当我将 D 声明为全局参数时,它没有帮助。 无论如何,在matlab中我可以通过函数中的引用传递D并最终得到结果吗? 提前致谢。 抱歉我的英语。
最佳答案
你可以只使用prod(sum(x,2))
吗?我认为,如果您重新排列总和中的项,您会发现只需将各行的总和相乘即可得到相同的结果。 (但也许我完全误解了您正在寻找的内容)。
例如:
>> x=[1 2 3 ; 4 5 6; 7,8,9]
x =
1 2 3
4 5 6
7 8 9
>> prod(sum(x,2))
ans =
2160
>> 1*4*7 + 1*4*8 + 1*4*9 + 1*5*7 + 1*5*8 + 1*5*9 + 1*6*7 + 1*6*8 + 1*6*9 + 2*4*7 + 2*4*8 + 2*4*9 + 2*5*7 + 2*5*8 + 2*5*9 + 2*6*7 + 2*6*8 + 2*6*9 + 3*4*7 + 3*4*8 + 3*4*9 + 3*5*7 + 3*5*8 + 3*5*9 + 3*6*7 + 3*6*8 + 3*6*9
ans =
2160
如果您确实需要使用组合方法递归地执行此操作,您应该能够仅将 D 作为输入传递,并将其作为函数的输出返回,如下所示:
function D = combination(n,A,x, D) % n= number of rows ,A= empty array, x = the matrix
if n == 0
D = D + prod(A);
else
for i = 1:1:3
A = [A x(n,i)];
D = combination(n-1,A,x, D);
if length(A)>=1
A = A(1:length(A)-1);
end
end
end
end
然后最初使用 D
等于 0 来调用它。
不用担心在这里通过引用传递。 MATLAB 没有按引用传递(它具有具有引用语义的变量,但这是另一回事),但它使用写时复制,并且对可以就地完成的计算进行了特殊优化,就像您的计算一样与 D
可以在这里。
关于matlab - matlab函数中如何通过引用传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48298861/