Can MATLAB pass by reference?

530 ビュー (過去 30 日間)
Doug Hull
Doug Hull 2011 年 1 月 18 日
コメント済み: Yorgos Tsitsikas 2023 年 9 月 15 日
How does MATLAB deal with this?
  1 件のコメント
E65EnyOwC
E65EnyOwC 2018 年 9 月 14 日
Check out: "How MATLAB Allocates Memory" in the Matlab help files

サインインしてコメントする。

採用された回答

Doug Hull
Doug Hull 2011 年 1 月 18 日
If you are attempting to use pass-by-reference to modify the input argument passed into a function, the answer to the question depends on whether the input is a handle object or a value object. The two types of objects are described in the Object-Oriented Programming
http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_oop/brfylq3.html and Programming Fundamentals http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/brtm8si.html sections of the documentation. By default, objects (including matrices, arrays, etc. of the built-in data types) are value objects.
Handle objects do exhibit reference behavior when passed as function arguments; value objects do not. When you pass a handle object to a function, MATLAB still copies the value of the argument to the parameter variable in the function (with one bit of subtlety; see below.) However, all copies of a handle object refer to the same underlying object.
If a function modifies a handle object passed as an input argument, the modification affects the object referenced by both the original and copied handles. In this case, the function does not need to return the result to be reassigned.
If instead you are attempting to use pass-by-reference to avoid unnecessary copying of data into the workspace of the function you're calling, you should be aware that MATLAB uses a system commonly called "copy-on-write" to avoid making a copy of the input argument inside the function workspace until or unless you modify the input argument. If you do not modify the input argument, MATLAB will avoid making a copy. For instance, in this code:
function y = functionOfLargeMatrix(x)
y = x(1);
MATLAB will not make a copy of the input in the workspace of functionOfLargeMatrix, as x is not being changed in that function. If on the other hand, you called this function:
function y = functionOfLargeMatrix2(x)
x(2) = 2;
y = x(1);
then x is being modified inside the workspace of functionOfLargeMatrix2, and so a copy must be made.
For more information on this behavior, read this posting http://blogs.mathworks.com/loren/2006/05/10/memory-management-for-functions-and-variables/ on Loren Shure's blog.
[From the MATLAB FAQ of Ancient Times]
  7 件のコメント
Bill Tubbs
Bill Tubbs 2021 年 10 月 22 日
Both the links in the answer seem to be broken now. Does anybody have updated URLs?
Is this one of them perhaps:
Yorgos Tsitsikas
Yorgos Tsitsikas 2023 年 9 月 15 日

サインインしてコメントする。

その他の回答 (4 件)

Marco
Marco 2012 年 7 月 18 日
Is this also true for nested function calls? Cuz it seems like it only works for direct function calls. In my GUIDE gui I have a function (call it Fn_takesHandles) that takes in the figure handles and updates the axes, when called by callback functions directly works just as intended. However, I run into problems when the stack frame is not one-to-one. A callBack function calls a helper function called Auto which in turn calls Fn_takesHandles. In this case it does not work as intended. Any changes made to the figure handles by Fn_takesHandles is not persistent. How would you go about solving this problem?
Is there any way to declare pointers in matlab? Any help would be appreciated!!
  1 件のコメント
Walter Roberson
Walter Roberson 2012 年 7 月 19 日
編集済み: Walter Roberson 2018 年 9 月 14 日
There is no way to declare pointers in MATLAB (at least not for calling MATLAB functions; there are ways to copy around pointers that have been created at the C / C++ level.)

サインインしてコメントする。


Jason Climer
Jason Climer 2017 年 6 月 20 日
Is this determined during the JIT compilation or as needed, i.e., is the copy of x made upon the function call or when the program executes
x(2) = 2;
?
  1 件のコメント
Walter Roberson
Walter Roberson 2017 年 6 月 20 日
It is generally determined when the program executes, as it is not always possible to tell ahead of time whether a value is shared or not. Especially when you consider the hidden effect of assignin() .
Also, overloading can happen at run-time: the current directory or path of an operation at the time a routine is first JIT'd is not necessarily going to be the same as during a later operation.
There are cases where MATLAB does enough analysis to establish that "update in place" can happen; I do not know enough about the mechanics of that to say how it is done taking into account overloading.

サインインしてコメントする。


Mandeguz
Mandeguz 2017 年 6 月 22 日
How about when writing MEXs? Can one pass by reference within the computational routine and pull those values back to the main MATLAB code that called the MEX?
  4 件のコメント
James Tursa
James Tursa 2018 年 9 月 14 日
Also note that as of R2015b, MATLAB passes arguments to mex routines as shared data copies (it used to pass them by reference).
James Tursa
James Tursa 2019 年 1 月 10 日
And as of R2018a, complex variable arguments to mex routines essentially get deep data copied in both directions if you use the -R2017a compilation model.

サインインしてコメントする。


Edgar Sanchez
Edgar Sanchez 2018 年 12 月 25 日
Maybe you can use global variables

カテゴリ

Help Center および File ExchangeMATLAB Compiler SDK についてさらに検索

製品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by