gpt4 book ai didi

matlab - 传递数组,没有开销(最好是 "by reference"),以避免在 matlab 中复制复杂的代码块?

转载 作者:太空宇宙 更新时间:2023-11-03 19:21:58 26 4
gpt4 key购买 nike

我在 Matlab 脚本中有复杂的代码块,它们作用于大型非稀疏数组。该代码对数组中的随机元素执行许多写入操作,以及读取操作。相同的代码必须针对不同的(大)数组执行(即相同的代码块,除了不同的数组变量名称)。

我不希望只有数组名称不同的长而重复的代码块。

不幸的是,当我创建一个函数来执行这些操作时,代码块只出现一次,性能下降了 10 倍或更多(可能是由于数组的复制)。但是,我不需要复制数组。我宁愿“通过引用传递”,这样函数调用的目的只是为了避免重复的代码块。然而,似乎没有办法避免写时复制语义。

此外,不可能(据我所知)创建脚本(不是函数)来实现此目的,因为脚本必须包含与调用脚本相同的变量名称,因此我需要为每个脚本创建一个不同的脚本我希望在其上运行脚本的数组,它什么也得不到(我仍然会有重复的代码块)。

我研究过创建一个别名变量名来“替代”感兴趣的数组变量名,在这种情况下我可以调用脚本并避免重复代码。但是,我找不到任何方法在 Matlab 中创建别名。

最后,我尝试编写一个利用 evalin() 函数的函数,并将数组变量的 string 名称传递给该函数,但尽管这可行,性能也大大降低 - 与按值将数组传递给函数大致相同(性能至少下降 10 倍)。

我得出的结论是,在对非稀疏数组执行复杂操作时,在 Matlab 中不可能避免重复代码块,以努力避免 Matlab 似乎使用任何可能的避免重复技术出现的可怕开销代码块。

我觉得这难以置信,但我找不到解决方法。

有人知道在 Matlab 中对多个非稀疏数组执行相同的复杂操作时避免重复代码块的方法吗?

最佳答案

Loren on his blog 所述, MATLAB 确实支持对矩阵的内联 操作,这基本上涵盖了通过引用传递数组、在函数中修改它们以及返回结果。您似乎知道这一点,但您错误地陈述了这一点,因为脚本必须包含与调用脚本相同的变量名。这是显示这是错误的代码示例。测试时请逐字复制并另存为函数:

function inplace_test
y = zeros(1,1e8);
x = zeros(1,1e8);

tic; x = compute(x); toc
tic; y = compute(y); toc
tic; x = computeIP(x); toc
tic; y = computeIP(y); toc
tic; x = x+1; toc
end

function x=computeIP(x)
x = x+1;
end

function y=compute(x)
y = x+1;
end

我电脑上的时间结果:

Elapsed time is 0.243335 seconds.
Elapsed time is 0.251495 seconds.
Elapsed time is 0.090949 seconds.
Elapsed time is 0.088894 seconds.
Elapsed time is 0.090638 seconds.

如您所见,使用in-place 函数的最后两次调用对于输入数组xy 的速度同样快。此外,它们与不带函数运行 x = x+1 一样快。唯一重要的是函数内部输入和输出参数是相同的。还有一件事......

如果我猜出您的代码有什么问题,我会说您制作了您希望就地使用的嵌套 函数。他们不是。所以下面的代码将不起作用:

function inplace_test
y = zeros(1,1e8);
x = zeros(1,1e8);

tic; x = compute(x); toc
tic; y = compute(y); toc
tic; x = computeIP(x); toc
tic; y = computeIP(y); toc
tic; x = x+1; toc

function x=computeIP(x)
x = x+1;
end

function y=compute(x)
y = x+1;
end
end

Elapsed time is 0.247798 seconds.
Elapsed time is 0.257521 seconds.
Elapsed time is 0.229774 seconds.
Elapsed time is 0.237215 seconds.
Elapsed time is 0.090446 seconds.

底线 - 小心那些嵌套函数..

关于matlab - 传递数组,没有开销(最好是 "by reference"),以避免在 matlab 中复制复杂的代码块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13078338/

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