在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5726|回复: 2

swap: matlab中交换两个变量--与大家讨论

[复制链接]
发表于 2009-5-10 23:34:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 eecsseudl 于 2013-4-29 10:04 编辑

matlab程序效率低下,其中一个原因就是它的参数无法引用,每次都是传值。这不但 导致效率问题,要实现某些功能,也需要一些特殊的手段。比如最简单的,如果交换两个变量的值,也就是在C/C++里的函数void swap(int& a, int& b),在C/C++里实现很容易,但在matlab里,你会吗?
下面这个解决方法很巧妙,因为它的实现很有参考价值,附在下面欣赏一下。
function swap(A,B)% SWAP - swap contents of two variables%
SWAP(A,B) puts the contents of variable A into variable B and vice versa.
%
You can
use either function syntax 'swap(A,B)' or command syntax 'swap A B'.%%
Example:
%
A = 1:4 ; B = 'Hello' ;
%
swap(A,B) ;
%
A % -> Hello
%
B % -> 1
2
3
4
%%
SWAP(A,B) is a convenient easy short-cut
for other (series of)%
commands that have the same effect, e.g.,
%
temp=A ; A=B ; B=temp ; clear temp ;
%
[B,A] = deal(A,B) ;
%
The advantage over these two methods is that using SWAP one does not
%
have to
declare intermediate variables or worry about output.%%
See also DEAL
% Tested in Matlab R13% version 1.1 (sep 2006)% (c) Jos van der Geest% email: jos@jasen.nl % 1.1 Use <deal> to swap (insight from Urs Schwarz)%
Added command syntax functionality (suggested by Duane Hanselman)
%
Modified help section
error(nargchk(2,2,nargin)) ; if ischar(A) && ischar(B),
% command syntax: SWAP VAR1 VAR2

evalstr =
sprintf('[%s,%s] = deal(%s,%s) ;',B,A,A,B) ;elseif ~isempty(inputname(1)) && ~isempty(inputname(2)),
%
function syntax: SWAP(VAR1,VAR2)
evalstr =
sprintf('[%s,%s] = deal(%s,%s) ;',inputname(2),inputname(1),inputname(1),inputname(2)) ;else
% No valid command syntax, force error

evalstr = '[' ;
endevalin('caller',evalstr,'error(''Requires two (string names of) existing variables'')') ; 另外附matlab参数传递的方式:
matlab使用的是一种叫作"copy-on-write"的矩阵拷贝构造函数,假如你定义了函数
function myfun(A,B)do something并在主程序中调用了myfun(Amat,Bmat),此时程序并不是把Amat/Bmat的内容全部复制给A和B,而是新建两个局部变量A和B, 这两个变量的数据部分通过两个指针分别指向Amat和Bmat数据段进行共享数据,并把Amat/Bmat中的一个叫作refcnt(reference count)的变量加一。这样避免了拷贝大量数据的开销。
在myfun中,如果你只读取A中的数据,此时,使用A完全等价于使用Amat中的数据, 但如果你需要修改A中的数据,此时matlab先检查A(Amat)的refcnt,如果这个数大于1,则说明除了A,还有其他矩阵也同时共享这个数据, 为了保证这次修改仅对于A有效,这时候matlab才会在内存中复制原来Amat的数据内容给A,然后修改A中的数据。此时A已与Amat分离。
大多数C++矩阵类都是通过refcnt的机制来进行复制的。
如果有大量参数传递,可以考虑写c mex/fortran mex,也可以使用global,还可以用evalin(WS,...)。







发表于 2009-5-14 22:36:07 | 显示全部楼层
好东西!
发表于 2009-5-14 22:37:12 | 显示全部楼层
好东西啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-19 18:33 , Processed in 0.364213 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表