【问题标题】:how to pass parameters by reference in matlab functionmatlab函数中如何通过引用传递参数
【发布时间】:2018-06-26 04:49:59
【问题描述】:

我是 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并在最后得到结果? 提前致谢。 对不起我的英语。

【问题讨论】:

  • 如果您想了解一种相对先进的方法来执行此操作,请参阅handle classes。

标签: matlab reference


【解决方案1】:

将其声明为全局即可完成这项工作,但是,您应该将其作为输入传递,并将其作为输出返回。

如果您的代码不需要副本,MATLAB 会注意不制作副本。

【讨论】:

    【解决方案2】:

    如果在函数定义中写:

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

    【讨论】:

    • 但是 OP 的代码是 D=D+... 所以他也需要它作为输入
    【解决方案3】:

    你能用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 可以在这里。

    【讨论】:

    • 确实,像A=func(A) 这样的调用已针对函数就地工作进行了优化,但前提是函数是用function A=func(A) 定义的。也就是说,在函数定义和调用函数时,输入和输出都必须使用同一个变量。
    猜你喜欢
    • 2015-07-06
    • 2019-02-12
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    相关资源
    最近更新 更多