gpt4 book ai didi

matlab - MATLAB 中 x = f(x) 形式的函数调用的内存分配

转载 作者:行者123 更新时间:2023-12-01 11:32:46 25 4
gpt4 key购买 nike

在我的代码中,我有很多地方可以调用

形式的函数
X = f(X)

X 可以是一个相当大的矩阵。在我的特殊情况下,我的电话大多是这样的

X = feval(somefunc, X)

X = obj.myfunc(X)

如果每次调用该函数时,都会为 X 分配新的空间,那就太糟糕了。MATLAB 是否足够智能以处理此类函数调用?有办法告诉吗?

这个问题的答案对设计决策很有帮助。我喜欢以面向对象的风格编程,如果 MATLAB 不够智能,我可能会在类中为 X 添加另一个成员,但我宁愿不这样做。

最佳答案

在 MATLAB 中调用函数时是否复制输入参数取决于函数内部发生的情况。

MATLAB 使用称为 copy-on-write 的系统.这意味着如果您将一个大变量作为输入传递给一个函数,只要您不在该函数内修改该变量,该变量就不会被复制到该函数的工作区中,该函数将改为从中读取数据它是内存中的当前位置。

function Y = func(X)
Y = X + 1;
end

如果您正在修改函数内的变量,则会生成输入变量的副本并将其放入函数的本地工作区。

function X = func(X)
X = X + 1;
end

关于 Loren's Mathworks blog 有更多信息.

确定是否创建了数据副本的一种简单方法是使用未记录的 format debug 模式,该模式将向您显示给定变量的数据在内存中的存储位置。

format debug

%// Create a variable a and show where debug info
a = [1,2]

%// Structure address = 141f567f0
%// m = 1
%// n = 2
%// pr = 7f9540b85e20
%// pi = 0
%// 1 2

%// Assign b = a but don't modify
b = a

%// Structure address = 141f567f0
%// m = 1
%// n = 2
%// pr = 7f9540b85e20 <= POINTER TO DATA REMAINED UNCHANGED
%// pi = 0
%// 1 2

%// Modify (Will create a new copy)
b = b + 1

%// Structure address = 141f55b40
%// m = 1
%// n = 2
%// pr = 7f953bcf1a20 <= POINTER TO DATA CHANGED (COPY)
%// pi = 0
%// 2 3

如果您愿意,可以使用我创建的这个小匿名函数来检查任何特定变量的内存位置。

memoryLocation = @(x)regexp(evalc('disp(x)'), '(?<=pr\s*=\s*)[a-z0-9]*', 'match')

a = [1,2];
memoryLocation(a)
%// 7f9540b85e20

b = a;
memoryLocation(b)
%// 7f9540b85e20

b = b + 1;
memoryLocation(b)
%// 7f953bcf1a20

作为旁注,我建议不要在整个代码中使用 feval,而是直接使用函数名称。

关于matlab - MATLAB 中 x = f(x) 形式的函数调用的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37157125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com