我有一个值 double M 数组,其中 size(M)=15000
我需要使用命令 diag(M) 将此数组转换为对角矩阵
但我得到了著名的错误out of memory
我使用选项 -nojvm 运行 matlab 以获得内存空间
并在 Windows 上使用 optin 3GB 开关
我也尝试将我的数组转换为双精度
但问题仍然存在
还有其他想法吗?
我有一个值 double M 数组,其中 size(M)=15000
我需要使用命令 diag(M) 将此数组转换为对角矩阵
但我得到了著名的错误out of memory
我使用选项 -nojvm 运行 matlab 以获得内存空间
并在 Windows 上使用 optin 3GB 开关
我也尝试将我的数组转换为双精度
但问题仍然存在
还有其他想法吗?
除了生成完整的对角矩阵(这将非常稀疏)之外,还有更好的方法来做你可能想做的任何事情。
将包含 2.25 亿个元素的矩阵乘以其他矩阵也需要很长时间。
我建议您重组您的算法以利用以下事实:
diag(M)(a, b) =
M(a) | a == b
0 | a != b
你会节省大量的时间和记忆,无论谁付钱给你都会更快乐。
这是对角矩阵的样子:
除了沿矩阵对角线的那些(行索引等于列索引的那些)之外的每个条目都为零。将此示例与您提供的值相关联,diag(M) = A
以及M(n) = An
Use saprse matrix
M = spdiags( M, 0, numel(M), numel(M) );
For more info see matlab doc on spdiags
and on sparse matrices in general.
如果您有一个n
逐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
,n
但是没有办法解决您n^2*8
至少需要字节来存储双打矩阵。
但是,您仍然可能会遇到问题。正如@user2379182 所建议的那样,我会调查稀疏数据类型。或者重做你的算法。或者更好的是,考虑获得 64 位 Matlab 和/或 64 位操作系统!