我想连接一些矩阵(20-30)。我写了一个简单的函数:
function [ appendedResults ] = appendResults( startNumber, endNumber )
str2 = '_simulation.xlsx';
str1 = num2str(startNumber);
InputFilename = strcat(str1, str2);
appendedResults = uint16( xlsread(InputFilename ) );
for i= startNumber+1 : endNumber
temp_simulationResults = uint16( xlsread(InputFilename ) );
appendedResults = vertcat( appendedResults, temp_simulationResults );
end
filename1 = strcat('appended', str2);
xlswrite(filename1, appendedResults);
end
如果我使用3-4个矩阵,它可以正常工作。但是当我使用更多时,我收到一个错误:
Error using xlswrite (line 219)
Error: Not enough memory
然后matlab使用6 GigaByte(!!)内存。矩阵只有7兆字节!
我用for循环编写了另一个函数(没有Matlab Vertcat函数)。 我得到同样的错误!
function [ appendedResults ] = appendResultsInOneMatrix( startNumber, endNumber )
str2 = '__simulation.xlsx';
str1 = num2str(startNumber);
InputFilename = strcat(str1, str2);
numberOfItems = (endNumber - startNumber) + 1 ;
firstResults = uint16( xlsread(InputFilename ) );
[row , col] = size(firstResults);
appendedResults = zeros ( row * numberOfItems , col);
for i=1: row
for j=1:col
appendedResults( i , j ) = firstResults( i , j);
end
end
for i= startNumber+1 : endNumber
str1 = num2str(i);
InputFilename = strcat(str1, str2);
temp_simulationResults = uint16( xlsread(InputFilename ) );
[temp_row , temp_col] = size(temp_simulationResults);
for m = 1 : temp_row
for n = 1 : temp_col
appendedResults( m+row , n ) = temp_simulationResults( m , n);
end
end
end
filename1 = strcat('appended', str2);
xlswrite(filename1, appendedResults);
end
怎么了?
答案 0 :(得分:1)
如果连接矩阵,结果维数将是输入矩阵的各个维度乘以矩阵数的最大值;例如,如果矩阵A
是1x1,000,000而矩阵B
是1,000,000x1,那么这些矩阵的单独存储将只有100万个元素,但是生成的矩阵需要存储2 * 10 < sup> 12 元素!
编辑:同样,Excel文件肯定是不是您应该用于超过一百万个条目的表的存储空间!
EDIT2 :拿一张纸。在上面画一个1厘米×10厘米(宽x高)的矩形,在上面写上“矩阵A”,这样你就可以知道矩形是如何定向的,而不是意外地旋转它。把它剪掉。绘制一个10厘米x 1厘米的矩形,在其上写上“矩阵B”,出于同样的原因。
连接两个矩形。您需要将此形状包围起来的矩形的区域是多少?什么是“矩阵A”和“矩阵B”矩形的面积之和?
矩阵是矩形的,默认情况下,您必须有足够的空间来存储包含矩阵串联的最小矩形。您可以通过在Matlab中使用稀疏矩阵来更改它(这是一个很长的主题,并且不能在单个StackOverflow答案中解释),但这不会改变您正在做的事情可能不会产生最少的事实感。