Matlab里面获取一个矩阵的子矩阵是否拷贝内存?

VShaka
昵称 10月07日 字数 241

刚开始用matlab真摸不到头脑。

简单来说,A是一个10*10矩阵。如果令B=A;那么内存是否复制了一份?

又如,要执行A的子矩阵相乘,C=A(:,6:end)*A(:,6:end)',这个里面取子矩阵的时候,是否构造临时变量增加了内存消耗?

有没有获取A的某一个位置的“指针”的方法?

MathTools 数学工具
13 个回复
cafitren
挿fit人 10月07日

你想太多了,还是去用c吧。

【 在 VShaka 的大作中提到: 】

: 刚开始用matlab真摸不到头脑。

: 简单来说,A是一个10*10矩阵。如果令B=A;那么内存是否复制了一份?

: 又如,要执行A的子矩阵相乘,C=A(:,6:end)*A(:,6:end)',这个里面取子矩阵的时候,是否构造临时变量增加了内存消耗?

: ...................

zszqzzzf
炼狱天使——反者道之动 10月07日

复制了。和python不一样。

【 在 VShaka (昵称) 的大作中提到: 】

: 刚开始用matlab真摸不到头脑。

: 简单来说,A是一个10*10矩阵。如果令B=A;那么内存是否复制了一份?

: 又如,要执行A的子矩阵相乘,C=A(:,6:end)*A(:,6:end)',这个里面取子矩阵的时候,是否构造临时变量增加了内存消耗?

: ...................

mazz
振翅欲飞 10月07日

Python内核靠指针?

【 在 zszqzzzf 的大作中提到: 】

: 复制了。和python不一样。

sssss
冬至 10月07日

应该是延时复制的

不过这种细节问题一般是不需要用户关心的

【 在 VShaka (昵称) 的大作中提到: 】

: 刚开始用matlab真摸不到头脑。

: 简单来说,A是一个10*10矩阵。如果令B=A;那么内存是否复制了一份?

: 又如,要执行A的子矩阵相乘,C=A(:,6:end)*A(:,6:end)',这个里面取子矩阵的时候,是否构造临时变量增加了内存消耗?

: ...................

VShaka
昵称 10月07日

我理解,因该是不一定会复制。

如果B=A之后,B一直没有改变,也就是说B永远出现在表达式右侧,则不会copy内存。如果B出现了改变,那么在改变的那一刻copy。

不知道我理解的对不对。

我看Matlab函数就是这样,传参数是否是copy内存要看这个参数是否发生了改变。在一个作用域内,应该也是这个规则吧。

【 在 sssss 的大作中提到: 】

: 应该是延时复制的

: 不过这种细节问题一般是不需要用户关心的

VShaka
昵称 10月07日

永远复制?

还是发生改变才复制?

如果始终复制,那matlab岂不是会增加很多内存消耗,而且无法控制,这太不可思议了。

似乎python更为合理?

【 在 zszqzzzf 的大作中提到: 】

: 复制了。和python不一样。

zszqzzzf
炼狱天使——反者道之动 10月07日

应该是程序员关心的问题,为啥要把责任推给系统?

把用不到的程序段给删了呀。

【 在 VShaka (昵称) 的大作中提到: 】

: 永远复制?

: 还是发生改变才复制?

: 如果始终复制,那matlab岂不是会增加很多内存消耗,而且无法控制,这太不可思议了。

: ...................

VShaka
昵称 10月07日

A = zeros(10,10);

B = A(:,6:end)*A(:,6:end)';

一个矩阵的一部分取出作为一个子矩阵参与运算是时常发生的,比如上面的语句。那么这个构造子矩阵的临时对象A(:,6:end)是否拷贝了内存?

这显然是不能拷贝的,在MKL里面,可以直接把指针指向子矩阵的起始位置,然后设置leading dimension和原始矩阵一样即可。

Matlab不可能这么弱吧,这个肯定不会拷贝内存,否则内存哪里够用,一个复杂语句就内存爆了。但这个机制有官方说法么?我是Matlab 新手,想了解一下。

【 在 zszqzzzf 的大作中提到: 】

: 应该是程序员关心的问题,为啥要把责任推给系统?

: 把用不到的程序段给删了呀。

zszqzzzf
炼狱天使——反者道之动 10月07日

matlab又不是弱智。一般计算已经优化到相当程度了。

你想了解的问题,属于编译原理。

【 在 VShaka (昵称) 的大作中提到: 】

: A = zeros(10,10);

: B = A(:,6:end)*A(:,6:end)';

: 一个矩阵的一部分取出作为一个子矩阵参与运算是时常发生的,比如上面的语句。那么这个构造子矩阵的临时对象A(:,6:end)是否拷贝了内存?

: ...................

VShaka
昵称 10月07日

这不是优化问题,是必须要知道的。

打个比方,一个矩阵对角化,你可以不知道这个函数内部到底消耗多少内存(lapack一般是有估计公式的),但输入的矩阵是否被拷贝必须是知道的。

否则连基本的内存消耗都估计不出来,怎么提交计算?

【 在 zszqzzzf 的大作中提到: 】

: matlab又不是弱智。一般计算已经优化到相当程度了。

: 你想了解的问题,属于编译原理。

zszqzzzf
炼狱天使——反者道之动 10月07日

太简单了,报错之后,改程序重新执行。

【 在 VShaka (昵称) 的大作中提到: 】

: 这不是优化问题,是必须要知道的。

: 打个比方,一个矩阵对角化,你可以不知道这个函数内部到底消耗多少内存(lapack一般是有估计公式的),但输入的矩阵是否被拷贝必须是知道的。

: 否则连基本的内存消耗都估计不出来,怎么提交计算?

: ...................

templarsf
sf 10月22日

拷贝的,这种你做个实验不就知道了,盯着任务管理器的内存使用看,运行类似命令的

超大矩阵的时候,内存使用是上升的。

【 在 VShaka (昵称) 的大作中提到: 】

: A = zeros(10,10);

: B = A(:,6:end)*A(:,6:end)';

: 一个矩阵的一部分取出作为一个子矩阵参与运算是时常发生的,比如上面的语句。那么这个构造子矩阵的临时对象A(:,6:end)是否拷贝了内存?

: ...................

woshiqingwa
抗拒拆迁是违法行为! 10月25日

我的印象是matlab就这么弱。。。。

【 在 VShaka (昵称) 的大作中提到: 】

: A = zeros(10,10);

: B = A(:,6:end)*A(:,6:end)';

: 一个矩阵的一部分取出作为一个子矩阵参与运算是时常发生的,比如上面的语句。那么这个构造子矩阵的临时对象A(:,6:end)是否拷贝了内存?

: ...................