如何在MATLAB中连接两个长度为20,000,000的向量?
X = randn(1,20000000);
Y = X;
z = [x y];
w = [x y];
当我输入w = [x y];它出错了:
使用horzcat时出错 内存不足。键入HELP MEMORY以获取选项。
>> [uV sV] = memory
uV =
MaxPossibleArrayBytes: 710127616
MemAvailableAllArrays: 1.6797e+009
MemUsedMATLAB: 345354240
sV =
VirtualAddressSpace: [1x1 struct]
SystemMemory: [1x1 struct]
PhysicalMemory: [1x1 struct]
>> sV.VirtualAddressSpace
ans =
Available: 1.6797e+009
Total: 2.1474e+009
>> sV.SystemMemory
ans =
Available: 4.4288e+009
>> sV.PhysicalMemory
ans =
Available: 2.5376e+009
Total: 3.4889e+009
答案 0 :(得分:1)
此document说明了如何解决错误。出错的原因主要是由于机器的内存约束而不是MATLAB。
答案 1 :(得分:1)
以下是人们通常如何有效地做到这一点:
x = ones(20000000,1);
y = x;
z1 = [x y];
z2 = [x; y];
第一个用于水平连接,第二个用于垂直连接。 这对我来说不会产生任何错误,即使我将变量变大了10倍。
如果无法运行前三行,则可能没有足够的内存来存储4x20000000数字。您可以尝试是否有足够的内存来存储3x20000000数字并改为使用它:
x = [x y];
如果我的exaple没有出现错误,那么你可能做错了,请显示重现错误的代码。
答案 2 :(得分:1)
你可以做的不多,或者有足够的记忆。
单个20.000.000元素双向量占用320MB。这使得连接版本的容量为640MB。
如果您的连接类似于c = [a,b]
,则总计最多为1.28 GB(因为您将拥有a
,b
和c
)。
1.28GB是否“很多”取决于您的机器。
如果你的机器有足够的内存,你应该尝试在matlab中最终清除现有的其他大型矩阵,甚至关闭其他应用程序。
最后但并非最不重要:
如果您的向量包含大量零,则应检查sparse
矩阵。
它们只存储非零元素,因此可能占用更少的内存。
答案 3 :(得分:1)
可以在documentation中找到一般答案。如果这不能解决您的问题,请将您的代码添加到问题中。也许预分配或其他东西可以解决内存问题。