1

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

我需要使用命令 diag(M) 将此数组转换为对角矩阵

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

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

并在 Windows 上使用 optin 3GB 开关

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

但问题仍然存在

还有其他想法吗?

4

3 回答 3

3

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

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

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

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

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

这是对角矩阵的样子:

除了沿矩阵对角线的那些(行索引等于列索引的那些)之外的每个条目都为零。将此示例与您提供的值相关联,diag(M) = A以及M(n) = An

于 2013-06-06T20:21:40.093 回答
2

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.

于 2013-06-06T20:34:02.010 回答
0

如果您有一个nn方矩阵,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字节(索引操作需要一些字节)。如果您需要一个(完整的,非稀疏的)对角矩阵,还有其他方法可以节省更多nn但是没有办法解决您n^2*8至少需要字节来存储双打矩阵。

但是,您仍然可能会遇到问题。正如@user2379182 所建议的那样,我会调查稀疏数据类型。或者重做你的算法。或者更好的是,考虑获得 64 位 Matlab 和/或 64 位操作系统!

于 2013-06-06T23:43:50.530 回答