返回的数组是按值复制还是在MATLAB中作为参考返回?

时间:2017-03-30 21:24:51

标签: matlab reference return

我想问一下如何返回MATLAB中的值?它们是通过引用复制还是传递的?

使用矩阵A查看此示例:

function main
    A = foo(10);

    return;
end

function [resultMatrix] = foo(count)
    resultMatrix = zeros(count, count);
    return;
end

当函数返回矩阵并将其赋值给变量A

时,是否会发生复制操作

1 个答案:

答案 0 :(得分:2)

MATLAB使用称为copy-on-write的系统,其中只在必要时(即数据被修改时)才生成数据副本。从函数返回变量时,在函数内部创建变量和调用函数存储在不同变量中之间不会对其进行修改。因此,在您的情况下,您可以将变量视为通过引用传递。但是,一旦修改了数据,就会制作一份副本

您可以使用format debug检查此行为,这实际上会告诉我们数据的内存位置(详情请参阅this post

因此,如果我们稍微修改您的代码,以便我们打印每个变量的内存位置,我们就可以跟踪复制时间

function main()
    A = foo(10);

    % Print the address of the variable A
    fprintf('Address of A in calling function: %s\n', address(A));

    % Modify A
    B = A + 1;

    % Print the address of the variable B
    fprintf('Address of B in calling function: %s\n', address(B));
end

function result = foo(count)
    result = zeros(count);

    % Print the address of the variable inside of the function
    fprintf('Address of result in foo: %s\n', address(result));

end

function loc = address(x)
    % Store the current display format
    fmt = get(0, 'format');

    % Turn on debugging display and parse it
    format debug
    loc = regexp(evalc('disp(x)'), '(?<=pr\s*=\s*)[a-z0-9]*', 'match', 'once');

    % Revert the display format to what it was
    format(fmt);
end

这会产生以下(或类似)输出

Address of result in foo: 7f96d9d591c0
Address of A in calling function: 7f96d9d591c0
Address of B in calling function: 7f96d9c74400

作为旁注,您不需要在您的情况下明确使用return,因为函数在遇到end时会自然返回。 return仅在您需要使用它来改变程序流程并提前退出函数时才需要。