如何在matlab函数中通过引用传递参数

时间:2018-01-17 10:28:49

标签: matlab reference

我是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并在结束时获得结果吗? 提前致谢。 对不起我的英文。

3 个答案:

答案 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自己的函数可以处理这个任务,但我不确定。