我想问一下如何返回MATLAB中的值?它们是通过引用复制还是传递的?
使用矩阵A
查看此示例:
function main
A = foo(10);
return;
end
function [resultMatrix] = foo(count)
resultMatrix = zeros(count, count);
return;
end
当函数返回矩阵并将其赋值给变量A
?
答案 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
仅在您需要使用它来改变程序流程并提前退出函数时才需要。