- 主题:Matlab里面获取一个矩阵的子矩阵是否拷贝内存?
刚开始用matlab真摸不到头脑。
简单来说,A是一个10*10矩阵。如果令B=A;那么内存是否复制了一份?
又如,要执行A的子矩阵相乘,C=A(:,6:end)*A(:,6:end)',这个里面取子矩阵的时候,是否构造临时变量增加了内存消耗?
有没有获取A的某一个位置的“指针”的方法?
--
FROM 111.201.210.*
我理解,因该是不一定会复制。
如果B=A之后,B一直没有改变,也就是说B永远出现在表达式右侧,则不会copy内存。如果B出现了改变,那么在改变的那一刻copy。
不知道我理解的对不对。
我看Matlab函数就是这样,传参数是否是copy内存要看这个参数是否发生了改变。在一个作用域内,应该也是这个规则吧。
【 在 sssss 的大作中提到: 】
: 应该是延时复制的
: 不过这种细节问题一般是不需要用户关心的
:
--
FROM 111.201.210.*
永远复制?
还是发生改变才复制?
如果始终复制,那matlab岂不是会增加很多内存消耗,而且无法控制,这太不可思议了。
似乎python更为合理?
【 在 zszqzzzf 的大作中提到: 】
: 复制了。和python不一样。
--
FROM 111.201.210.*
A = zeros(10,10);
B = A(:,6:end)*A(:,6:end)';
一个矩阵的一部分取出作为一个子矩阵参与运算是时常发生的,比如上面的语句。那么这个构造子矩阵的临时对象A(:,6:end)是否拷贝了内存?
这显然是不能拷贝的,在MKL里面,可以直接把指针指向子矩阵的起始位置,然后设置leading dimension和原始矩阵一样即可。
Matlab不可能这么弱吧,这个肯定不会拷贝内存,否则内存哪里够用,一个复杂语句就内存爆了。但这个机制有官方说法么?我是Matlab 新手,想了解一下。
【 在 zszqzzzf 的大作中提到: 】
: 应该是程序员关心的问题,为啥要把责任推给系统?
: 把用不到的程序段给删了呀。
:
--
FROM 111.201.210.*
这不是优化问题,是必须要知道的。
打个比方,一个矩阵对角化,你可以不知道这个函数内部到底消耗多少内存(lapack一般是有估计公式的),但输入的矩阵是否被拷贝必须是知道的。
否则连基本的内存消耗都估计不出来,怎么提交计算?
【 在 zszqzzzf 的大作中提到: 】
: matlab又不是弱智。一般计算已经优化到相当程度了。
: 你想了解的问题,属于编译原理。
:
--
FROM 111.201.210.*