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

在matlab中使用diag函数时出现内存不足错误,matlab,matrix,out-of-memory,rounding,Matlab,Matrix,Out Of Memory,Rounding,我有一个值为双M的数组,其中sizeM=15000 我需要用diagM命令将这个数组转换成对角矩阵 但是我从记忆中得到了这个著名的错误 我使用选项-nojvm运行matlab以获得内存空间 使用windows上的optin 3GB开关 我还尝试将数组转换为双精度 但问题依然存在 还有其他想法吗?有比生成完全稀疏的对角矩阵更好的方法来完成您可能要做的事情 将包含2.25亿个元素的矩阵乘以其他矩阵也需要很长时间 我建议您重组算法,以充分利用以下事实: diag(M)(a, b) =

我有一个值为双M的数组,其中sizeM=15000

我需要用diagM命令将这个数组转换成对角矩阵

但是我从记忆中得到了这个著名的错误

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

使用windows上的optin 3GB开关

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

但问题依然存在


还有其他想法吗?

有比生成完全稀疏的对角矩阵更好的方法来完成您可能要做的事情

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

我建议您重组算法,以充分利用以下事实:

diag(M)(a, b) =
                   M(a)    | a == b
                   0       | a != b
你将节省大量的时间和记忆,无论谁付钱给你都会更快乐

这就是对角矩阵的样子:


除了沿着矩阵对角线的条目,行索引等于列索引的条目为零。将此示例与您提供的值diagM=A和Mn=An关联起来,有比生成非常稀疏的完整对角矩阵更好的方法来完成您可能要做的事情

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

我建议您重组算法,以充分利用以下事实:

diag(M)(a, b) =
                   M(a)    | a == b
                   0       | a != b
你将节省大量的时间和记忆,无论谁付钱给你都会更快乐

这就是对角矩阵的样子:

除了沿着矩阵对角线的条目,行索引等于列索引的条目为零。将此示例与您提供的值相关联,diagM=A和Mn=An

使用SAPSE矩阵

 M = spdiags( M, 0, numel(M), numel(M) );
有关更多信息,请参阅matlab doc on和on general.

使用SAPSE矩阵

 M = spdiags( M, 0, numel(M), numel(M) );
有关更多信息,请参见matlab文档on和on。如果您有一个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位操作系统

如果你有一个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位操作系统

仅此阵列就有1.8GB。如果您有任何其他大型数据结构,您将用完。您可以更改您的变量类型吗?试试这个:A=diaguint161:50000@pm89数组值是什么意思?size函数从不返回标量。M是15000乘15000的矩阵还是15000乘1的向量还是15000乘1的向量?你要把向量转换成对角矩阵吗?或者你想从M中提取对角线,然后可能调用diagm?所有这些都是不同的。你的意思是你试图转换为单精度吗?你说M是一个双数组。转换为单精度只会将内存使用量减少一半,并将大大降低数值精度。仅此阵列就有1.8GB。如果您有任何其他大型数据结构,您将用完。您可以更改您的变量类型吗?试试这个:A=diaguint161:50000@pm89数组值是什么意思?size函数从不返回标量。M是15000乘15000的矩阵还是15000乘1的向量还是15000乘1的向量?是
你要把向量转换成对角矩阵吗?或者你想从M中提取对角线,然后可能调用diagm?所有这些都是不同的。你的意思是你试图转换为单精度吗?你说M是一个双数组。转换为单精度只会将内存使用量减少一半,并会大大降低数值精度。你能解释更多你的想法吗?你能解释更多你的想法吗?