我是matlab的初学者,我想计算从不同行中挑选的(3 * n)矩阵元素的每个可能组合的乘积之和。
例如,如果矩阵是x = [1 2 3,4 4 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并在结束时获得结果吗? 提前致谢。 对不起我的英文。
答案 0 :(得分:5)
你能使用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
等于零的情况下调用它。
不要担心这里通过引用传递。 MATLAB没有通过引用传递(它有变量具有引用语义,但这是一个不同的东西),但它使用了写时复制,并且对可以就地完成的计算进行了特殊优化,作为计算D
可以在这里。
答案 1 :(得分:0)
将它声明为全局工作,但是,您应该将其作为输入传递,并将其作为输出返回。
如果您的代码不需要副本,MATLAB将负责不制作副本。
答案 2 :(得分:0)
如果你写了函数定义:
function D = combination(n,A,x,D)
D = D + something
end
您的功能可以通过以下方式调用:
输出=组合(n_in,A_in,x_in 递归遵循相同的方式,而不是调用
combination(n-1, A,x)
你写了
D = combination(n-1,A,x,D)
继续使用您的代码。
我希望这会对你有所帮助,也许有一个Matlab自己的函数可以处理这个任务,但我不确定。