如何节省内存以解决对称(或上层)的矩阵?

时间:2016-12-31 08:41:24

标签: arrays fortran lapack intel-fortran intel-mkl

我需要求解线性代数方程组//Caesar cipher in node var inquirer = require("inquirer"); inquirer.prompt([ { type: "input", name: "message", message: "Write the message you would like to encrypt:" }, { type: "input", name: "key", message: "Enter a number between 0 and 25" } ]).then(function(encrypted) { var newMessage = ''; if (encrypted.key < 0) { console.log("cypher key is negative"); reverseEncryption(); } else { console.log("cypher key is " + encrypted.key) for (var i = 0; i < encrypted.message.length; i++) { var newKey = encrypted.message[i]; //if (newKey.match(/[a-z]/i)){ var newCode = encrypted.message.charCodeAt(i); if ((newCode >= 65) && (newCode <= 90)) { newKey = String.fromCharCode(((newCode - 65 + encrypted.key) % 26) + 65); } else if ((newCode >= 97) && (newCode <= 122)) { newKey = String.fromCharCode(((newCode - 97 + encrypted.key) % 26) + 97); } //} newMessage += newKey; } } console.log(newMessage); }); var reverseEncryption = function() { var reverseMessage = ""; for (var i = 0; i < encrypted.message.length; i++) { var reverseKey = encrypted.message[i]; //if (newKey.match(/[a-z]/i)){ var reverseCode = encrypted.message.charCodeAt(i); if ((reverseCode >= 65) && (reverseCode <= 90)) { reverseKey = String.fromCharCode(((reverseCode - 65 + (encrypted.key + 26)) % 26) + 65); } else if ((reverseCode >= 97) && (reverseCode <= 122)) { reverseKey = String.fromCharCode(((reverseCode - 97 + (encrypted.key + 26)) % 26) + 97); } reverseMessage += reverseKey; } console.log(reverseMessage); };

矩阵A是双精度的,大小约为33000x33000,当我尝试分配它时会出错:

  

无法在数组大小计算上分配数组溢出。

由于我正在使用带有英特尔MKL库的LAPACK A.X = B,我想知道是否有办法以某种方式将较小的矩阵传递给库函数? (因为只需要一半的矩阵阵列来解决)

dposv函数只需要A. Here is more details about dposv.

的上三角矩阵或下三角矩阵

更新:请注意A矩阵为N x N,但dposvlda: INTEGER。那么可能有一种方法将A解析为一维数组吗?

2 个答案:

答案 0 :(得分:1)

正如错误所说(无法分配数组 - 在数组大小计算上溢出)您的问题似乎在其他地方:尤其是用于在内部计算数组大小的整数类型的限制。即使你添加更多内存,我担心你可能无法解决这个问题。您将需要检查您用于内存管理的库的内部(可能是MKL,但我不使用MKL,所以我无法帮助)或选择另一个。

说明,有些函数在分配时使用4个字节的整数来计算内存大小。这为您提供了2^32或4 GB内存的限制,您可以分配低于8 GB的数组。在那我假设无符号整数;带有符号整数,该限制为2 GB。

如果您的记忆力有限,则提示:

如果你没有足够的内存(因为它是三角形的,只有4 GB左右的矩阵)并且你不知道矩阵的结构,那么就忘掉特殊求解器并自己解决问题。求解具有上三角矩阵的系统是后向替换。从解决方案的最后一行开始,您只需要矩阵的一行来计算解决方案的每个组件。

找到一种从最后一行开始逐行加载矩阵的方法。

答案 1 :(得分:0)

感谢mecej4

有几种方法可以使用更少的内存传递一个巨大的矩阵: