在matlab中使用diag函数时出现内存不足错误

时间:2013-06-06 19:59:18

标签: matlab matrix out-of-memory rounding

我有一个有价值的双M数组,其中size(M)= 15000

我需要使用命令diag(M)

将此数组转换为对角矩阵

但我得到了着名的错误out of memory

我使用选项-nojvm运行matlab以获得内存空间

并在Windows上使用optin 3GB开关

我也尝试将我的数组转换为双精度

但问题仍然存在

还有其他想法吗?

3 个答案:

答案 0 :(得分:3)

除了生成完整的对角矩阵(非常稀疏)之外,还有更好的方法可以做任何你想要做的事情。

将具有2.25亿个元素的矩阵乘以其他矩阵也需要很长时间。

我建议您重构算法以利用以下事实:

diag(M)(a, b) =
                   M(a)    | a == b
                   0       | a != b

你将节省大量的时间和记忆,无论谁付钱给你都会更快乐。

这是对角矩阵的样子:

除了矩阵的对角线之外的每个条目(行索引等于列索引的条目)都为零。将此示例与您提供的值diag(M) = AM(n) = An

相关联

答案 1 :(得分:2)

使用稀疏矩阵

 M = spdiags( M, 0, numel(M), numel(M) );

有关详细信息,请参阅spdiagssparse matrices上的matlab文档。

答案 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位操作系统!