变量通过引用传递给函数

437(30天)
亚当
亚当 2012年9月28日
编辑: 巴特·麦科伊2021年12月7日
我读过的唯一方法通过引用传递函数是如果你通过一个句柄。有matlab调用得到一个变量或结构的“处理”?

接受的答案

丹尼尔Shub
丹尼尔Shub 2012年10月1日
虽然我认为IA的回答是更好的方法。如果你真的想做你正在谈论的您可以创建一个子类 处理
classdefmyClass <处理
属性
数据
结束
方法
函数h = myClass(数据)
h.data= data ;
结束
结束
结束
然后定义一个函数(这可能是一个方法)
函数myFunction (h)
h.data= h.data+2;
结束
让你做一些事情
h = myClass (0);
myFunction (h);
h.data
ans =
2
当然这样的事情 h + 2 你不会工作,除非实现吗 + 方法。
4评论

登录置评。

更多的答案(6)

图像分析
图像分析 2012年9月29日
实际上,你可以达到同样的效果通过输入参数。例如,在函数定义:
函数myVariable = ChangeMyVariable (myVariable)
myVariable = 2 * myVariable;
然后调用它,这样做:
myVariable = ChangeMyVariable (myVariable);
显然,myVariable可以是任何东西,比如像你提到的结构。对于所有意图和目的,这是一样的代码可以使用如果经过参考:
ChangeMyVariable (myVariable);
净效应是 你让你的变量改变 ,只是稍有不同的语法。
18岁的评论
每•艾萨克森
每•艾萨克森 2015年2月22日
我认为有一个错误在评论提多Edelhofer,应该读
var var = someFun (x, y),
而不是
var var = someFun (x, y),
@Royi,释放你跑步吗?

登录置评。


每•艾萨克森
每•艾萨克森 2012年9月28日
编辑:每•艾萨克森 2012年9月28日
不,没有办法通过一个变量通过引用。看到 内存管理函数和变量
2的评论
每•艾萨克森
每•艾萨克森 2012年9月28日
编辑:每•艾萨克森 2012年9月28日
不,不是记录了Matlab。而不是 http://undocumentedmatlab.com/ 据我所知。
你为什么想通过引用吗?

登录置评。


詹姆斯Tursa
詹姆斯Tursa 2012年9月29日
我又问别人已经问。你为什么想要“处理”变量?我们给你什么建议将取决于这个问题的答案。通知你,默认情况下MATLAB传递函数的参数的共享数据副本……即。,没有数据复制。所以它已经有效。但是我们真的需要知道你在做什么和函数内的变量以最好的回答你的问题,以及是否经过“参考”为您的应用程序是有意义的。
9日评论
马克•维兰特
马克•维兰特 2020年3月24日
我也花了大量的时间在c编程不早。在90年代的大部分时间里,后来改用c++,花时间逆向工程Objective - C和C的iOS越狱开发社区在2000年代后期。我花了很多时间在IRC频道包括C和C # # #,正如我所提到的,他们的使命声明基本上放弃了C作为应用程序的编程语言。我认为最优秀的C程序员,谁也不是盲目的宗教语言,诚实是几乎总是被一个更好的选择比C应用程序编程。只是没有足够丰富的标准库,也没有足够的第三方库,用于编写程序尽快或稳定,因为他们可以用c++写的。C很小,因此最适合的项目类型必须有小的足迹。用c++标准库+ RAII意味着您可以编写整个主要c++应用程序无需每个调用新的删除,malloc,或解放自己,基本上没有处罚。如果你有打电话给新/删除,你可以把它变成一个轻量级容器unique_ptr和继续异常安全的。简而言之,我认为很难认为构建应用程序用C比建筑在c++中,除了对环境中优化足迹是至关重要的。和,没有什么阻止你使用一个C库,需要在一个c++程序。 Heck, even compiling C code with a C++ compiler (which is more strict) would likely uncover hidden issues in your C code.

登录置评。


亚历山德罗
亚历山德罗 2013年4月16日
你好我想说一个可能的解决方案是以下(不使用类):
%引用一些matlab数据
函数参考= globaldata ()
数据= [];
参考=结构(“得到”@ get,“设置”,@SET);
函数dataout = GET ()
dataout =数据;
结束
函数集(datain)
数据= datain;
结束
结束
我看到这样的制造链表在matlab堆栈溢出。

拉蒙特Granquist
拉蒙特Granquist 2019年6月12日
这不是这么多的答案但为什么引用传递的一个例子将是有用的。我想把一组值的数值OutputFnc简单编程的方法是创建一个闭包在一个局部变量传递函数处理到数值和OutputFnc更新。自原始程序不是调用者OutputFnc——数值是不可能使用输出参数。
T0a = [];
选择= odeset (“OutputFcn”@ (t y国旗)odethrust (t, y,国旗,T0a mf_bar, thrust_bar));
[t、y] =数值(@ (t, y)颂歌(t y tf0/2、thrust_bar mf_bar, ve_bar), lgt, y0,选项);
T0a
函数dXdtau =颂歌(t yτ,thrust_bar、mf_bar ve_bar)
r = y (1);
v = y (2);
m = y (3);
如果m < mf_bar
T = 0;
其他的
T = thrust_bar;
结束
汇票= v;
dvdt = - 1 / r ^ 2 + T / m;
dmdt = - T / ve_bar;
汇票dXdtau =τ* [dvdt dmdt];
结束
函数状态= odethrust (t, y,国旗,t mf_bar thrust_bar)
如果isempty(标志)
m = y (3);
如果m < mf_bar
T = 0 [T];
其他的
T = [T thrust_bar];
结束
结束
状态= 0;
结束
这是真正的一个片段程序mf_bar / ve_bar / thrust_bar /等一些变量没有宣布。ODE的结构并不十分重要的除了我试图访问时间T的历史变量以及变量的集成(假装T的简单方法是现在可以处理任意复杂的所以我不想要的答案,找出问题分析这个循环之外的——如果你能猜问题域,可以肯定的是我知道火箭方程存在)。
重要的是我想要的方式宣布T0a作为一个空数组,然后传递到函数odethrust处理,这是数值的OutputFcn电话。
我保证没有什么错——计算机科学意义上的——想要传递闭包这样的积累状态。

巴特·麦科伊
巴特·麦科伊 2021年12月7日
编辑:巴特·麦科伊 2021年12月7日
现在我使用句柄类已经一段时间,他们尽可能接近“通过引用传递”你可以在MATLAB。是否真正“通过引用传递”或不可能是一个学术争论,因为它看起来和就像一只鸭子和行为像一个鸭子,所以....
当你创建一个句柄类的实例时,您仍然可以创建许多不同的、独立的实例。但对于每个实例创建,只有一个实例的副本,无论你多少次商店,通过到其他对象,存储,等等。在一个位置当你改变它,改变了所有位置,因为只有一个副本的实例。
一些实用的好处:
  1. 一个类方法,您可以修改对象的内容和你不再需要返回的对象。没有过期的危险物品。
  2. 一旦你创建和实例存储在某个地方(在其他对象、结构、对象数组,等等),该实例存在,直到所有引用您的实例都不见了,直到你运行删除(都)
  3. 如果你的对象存储大量的数据,处理类不会让复制你的数据和腹胀内存产品
  4. 如果你需要共享一个对象/数据和大量的物品,如全局设置或共同配置,或者如果你有通信/信息/标志变量之间共享很多对象,处理类是一个梦想! !创建一个实例和与你分享对象和让他们存储一生。每当一些对象的代码/类/函数更新单一实例,所有对象立即看到相同的更新。
处理类可能是一个好主意如果你想对象是流体和复制在数学操作,使用重载操作符的算术类操作....你期待隐式对象的副本(在右边的一组数学操作)独立行动,但他们其实是同一个对象。
让你的自定义类“处理阶级”,只需改变班上第一行:
%正常,non-handle类;一个对象实例经过价值;的
%实例(和所有数据)复制无处不在
classdefmyClass
% bla bla bla
结束
%处理类;一个对象实例就像引用传递;
%为每个实例,只有一个副本;改变一次,它的变化
%无处不在
classdefmyClass <处理
% bla bla bla
结束
%示例类和一些测试我写帮助澄清
%保存为InventoryHC.m
classdefInventoryHC <处理
属性
苹果= 0;
香蕉= 0;
总= 0;
结束
方法
函数obj = InventoryHC ()
结束
函数computeTotal (obj)
obj。总= obj。苹果+ obj.bananas;
结束
结束
结束
%测试代码来帮助理解处理类是如何工作的
清晰的所有;clc;
%处理类的一个实例
inv1 = InventoryHC ();
inv1。苹果= 20;
inv1。香蕉= 30;
inv1
inv1.computeTotal ();%注意! !对象发生了改变,你不需要返回的对象!
inv1
%的另一个独立的一个句柄类的实例
inv2 = InventoryHC ();
inv2。苹果= 100;
inv2。香蕉= 300;
inv2.computeTotal ();%注意! !对象发生了改变,你不需要返回的对象!
inv2
inv1
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%复制实例“inv1”和显示
%改变他们在一个位置的变化无处不在
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%分配实例“发票”到另一个变量
newInv = inv1;
%创建一个结构和存储对象
dataset1 =结构();
dataset1.A= inv1;
dataset1.B= newInv;
invArray = [inv1 newInv];% &存储实例创建一个对象数组
invCell = {inv1 newInv};%创建一个单元阵列和存储对象实例
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
现在%改变原来的实例在一个地方和显示
%到处都改变了
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
inv1%在我们改变它
inv1。苹果= 5;%进行更改
inv1。香蕉= 6;
inv1.computeTotal ();
inv1%视图改变原来的实例
newInv%视图实例的副本(这也是被改变)
dataset1.A%的实例存储在结构(这也是被改变)
dataset1.B
invArray (1)%实例对象数组(他们已经改变了)
invArray (2)
invCell {1}%实例单元阵列(他们已经改变了)
invCell {2}
清晰的inv1;%清楚原始var;它不是特别;实例的引用,就像结构,数组和单元阵列
newInv%对象还活着&
dataset1.A%对象还活着&
清晰的newInvdataset1%明显其他var和结构
invArray (1)%同一个对象仍然存在;它将继续坚持,直到:
%)的所有引用都不见了,垃圾收集
%——- b)你叫delete()显式地删除它
isvalid (invArray (2))%显示,我们仍然有一个有效的处理
删除(invArray (2));%删除数组中的第二个元素……这个擦出实例
isvalid (invArray (2))%显示处理不再有效
invArray (1)%现在只有一个空句柄…没有对象分配给它了
invArray (2)%现在只有一个空句柄…没有对象分配给它了
invCell {1}%现在只有一个空句柄…没有对象分配给它了
invCell {2}%现在只有一个空句柄…没有对象分配给它了
inv2%这是一个独特的实例由它自己的构造函数调用,所以它不是与inv1挂钩

类别

找到更多的在创建和连接矩阵帮助中心文件交换

下载188bet金宝搏

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!