Matlab中,两个很大的矩阵相乘内存溢出
答案:4 悬赏:60 手机版
解决时间 2021-02-01 07:13
- 提问者网友:你独家记忆
- 2021-02-01 02:45
Matlab中,两个很大的矩阵相乘内存溢出
最佳答案
- 五星知识达人网友:长青诗
- 2021-02-01 03:29
防止内存溢出的方法如下:
1、提前计算好矩阵大小,double型矩阵每个数字8字节。
2、使用memory指令查看当前可用内存与可以生成的最大矩阵。
3、使用pack指令可以整理空余内存,增大内存可以装下的嘴大矩阵的内存。
4、使用clear var指令清除不必要的变量。
5、内存不足可以设定虚拟内存,或换用内存更大的计算机。
6、优化算法或减少精度,除了重大科研项目外,一般计算计算机内存是足够的。
1、提前计算好矩阵大小,double型矩阵每个数字8字节。
2、使用memory指令查看当前可用内存与可以生成的最大矩阵。
3、使用pack指令可以整理空余内存,增大内存可以装下的嘴大矩阵的内存。
4、使用clear var指令清除不必要的变量。
5、内存不足可以设定虚拟内存,或换用内存更大的计算机。
6、优化算法或减少精度,除了重大科研项目外,一般计算计算机内存是足够的。
全部回答
- 1楼网友:持酒劝斜阳
- 2021-02-01 05:42
将矩阵分块
分成小块相乘再相加追问怎么分块呢?我不会啊, A是一个没有规律的数据50000*32维,不好分块啊?追答假设分成10块, 每块5000 行, 仍是32列
A=[A1; A2; ...; A10]
那么A' = [ A1', A2', ..., A3']
根据矩阵乘法
A*A' = [ A1*A1' A1*A2' .... A1*A10'
A2*A1' A2*A2' .... A2*A10'
...
A10*A1' A10*A2'... A10*A10']
10*10 块, 每块 是 (5000*32)矩阵乘以(32*5000) 应该内存足够
求出每一块积, A*A'则是这些块cat起来
如果内存还不够, 分更多的块
分成小块相乘再相加追问怎么分块呢?我不会啊, A是一个没有规律的数据50000*32维,不好分块啊?追答假设分成10块, 每块5000 行, 仍是32列
A=[A1; A2; ...; A10]
那么A' = [ A1', A2', ..., A3']
根据矩阵乘法
A*A' = [ A1*A1' A1*A2' .... A1*A10'
A2*A1' A2*A2' .... A2*A10'
...
A10*A1' A10*A2'... A10*A10']
10*10 块, 每块 是 (5000*32)矩阵乘以(32*5000) 应该内存足够
求出每一块积, A*A'则是这些块cat起来
如果内存还不够, 分更多的块
- 2楼网友:深街酒徒
- 2021-02-01 05:22
试试用64bit版本的matlab,64位程序可用的地址空间更大。
你机器的内存多大?我觉得现在的机器一般不会物理内存不足的。
你机器的内存多大?我觉得现在的机器一般不会物理内存不足的。
- 3楼网友:底特律间谍
- 2021-02-01 04:40
单论这个问题, 可以说没什么办法
不过你有必要搞清楚你是否一定要把A*A'乘出来, 乘出来之后干嘛用?
一般来讲很多实际问题根本不需要把A*A'显式乘出来, 也就是说你的最终目标未必一定要通过显式保存AA'才能达到, 应该设法把这步困难的操作回避掉或者换一种方式来实现
不过你有必要搞清楚你是否一定要把A*A'乘出来, 乘出来之后干嘛用?
一般来讲很多实际问题根本不需要把A*A'显式乘出来, 也就是说你的最终目标未必一定要通过显式保存AA'才能达到, 应该设法把这步困难的操作回避掉或者换一种方式来实现
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯