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