当传递给一个函数结构是怎么处理的?

4视图(30天)
你好,我的一个问题是如何处理结构时使用作为函数的输入参数。我知道写“复制”,即矩阵是通过引用,除非他们被修改,因此被复制。然而,我得到的印象结构实际使用指针或引用的数据字段,这使得结构不同于矩阵。这就是为什么我想知道,当我使用的写“复制”结构输入参数吗?
例子:1:矩阵)
函数= fun2(中)
=在;%返回引用
2:矩阵)
函数= fun2(中)
(2、5)= 4;% Matlab创建一个副本
=在;
3:结构,这里发生了什么?)
函数= fun3(中)
在。基坑=兰德(3);%这里发生了什么?
=在;
1评论
亚当
亚当 2014年12月17日
编辑:亚当 2014年12月17日
当我正在调查这种类型的行为(尽管不是结构)我只是创建了一个矩阵足够大,它出现在我的任务管理器内存分析,所以我可以看到什么时候的副本数据了(如果有的话)当调用一个函数。
你应该能够做同样的结构,如果你让你的基坑更像是兰德(20000)。
我没有调查结构所以不想给一个答案没有测试它,我真的没有时间。我希望他们的工作类似于矩阵。当然如果我添加或编辑一个字段在一个功能我不希望字段添加或更改调用函数的工作区。

登录置评。

接受的答案

罗伯特·卡明
罗伯特·卡明 2014年12月17日
我理解当你在结构中存储数据存储两件事
1。的矩阵/变量
2。的地址的内存/结构链接(即。基坑为例)
所以当你改变一个领域- >字段变化- >即您创建一个新的变量和内存地址的变化。看下面这个例子:
clc
清晰的
内存
一个。一个= 0 (10000、10000);
一个。2 = 0 (10000、10000);
b =一个;
流(2" b = = - >共享相同的内存\ n”);
内存
流(2' \ n现在改变一个行业只有在b \ n”);
b。两个= 1 (10000、10000);
内存
当两个字段 一个 创建了我们使用吗 1.6 gb (来自谁的变量的大小和内存被证实了matlab(从内存)。
从谁 b 也占用了 1.6 gb - >,但我们知道他们是相同的物理内存位置由于文案写——正如你所说。
现在,当我们改变 一个 的字段 b 我们可以检查内存使用量的增加(在上面的例子中 ~ .8GB ),我们看到,内存使用总量增加的新的单字段 b (再一次的 ~ .8GB )。
从这我们可以summise的例子 基坑 将创建新的(和占用内存)但任何其他字段保留相同的内存位置作为输入变量

答案(1)

比尔Tubbs
比尔Tubbs 2021年5月2日
编辑:比尔Tubbs 2021年5月2日
看来,MATLAB是结构的完整副本传递给函数 任何 元素是改变的函数(见下面演示脚本)。所以没有办法通过引用一个函数的结构吗? 从这篇文章似乎不是
年代。一个= 1;
年代。b= 2;
s2 = change_struct(年代);
断言(s。一个= = 1)
断言(s2。= = 2)
年代。b= -1;
断言(s2。b = = 2)
函数s2 = change_struct (s)
年代。一个= s.a + 1;
s2 = s;
结束

社区寻宝

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

开始狩猎!