我有一个有价值的双M数组,其中size(M)= 15000
我需要使用命令diag(M)
将此数组转换为对角矩阵但我得到了着名的错误out of memory
我使用选项-nojvm运行matlab以获得内存空间
并在Windows上使用optin 3GB开关
我也尝试将我的数组转换为双精度
但问题仍然存在
还有其他想法吗?
答案 0 :(得分:3)
除了生成完整的对角矩阵(非常稀疏)之外,还有更好的方法可以做任何你想要做的事情。
将具有2.25亿个元素的矩阵乘以其他矩阵也需要很长时间。
我建议您重构算法以利用以下事实:
diag(M)(a, b) =
M(a) | a == b
0 | a != b
你将节省大量的时间和记忆,无论谁付钱给你都会更快乐。
这是对角矩阵的样子:
除了矩阵的对角线之外的每个条目(行索引等于列索引的条目)都为零。将此示例与您提供的值diag(M) = A
和M(n) = An
答案 1 :(得分:2)
答案 2 :(得分:0)
如果你有n
- by - n
方阵,M
,你可以直接通过
n = size(M,1); % Or length(M), but this is more general
D = M(1:n+1:end); % 1-by-n vector containing diagonal elements of M
如果你有一个旧版本的Matlab,上面甚至可能比使用diag
更快(如果我记得,diag
并不总是编译功能)。然后,如果你需要保存内存并且只需要M
的对角线并且可以摆脱其余部分,你可以这样做:
M(:) = 0; % Zero out M
M(1:n+1:end) = D; % Insert diagonal elements back into M
clear D; % Clear D from memory
对于双精度值,这不应该在任何时候分配大约(n^2+n)*8 = n*(n+1)*8
个字节(索引操作需要一些)。如果你需要一个(完整的,非稀疏的)n
- by - n
对角矩阵,还有其他方法可以做到这一点,但是没有办法绕过你至少需要n^2*8
个字节来存储双精度矩阵。
但是,你仍然可能会遇到问题。我将研究稀疏数据类型,如@ user2379182所示。或者重做你的算法。或者更好的是,考虑获得64位Matlab和/或64位操作系统!