连接两个以上的矩阵 - 出现内存错误

时间:2015-03-22 11:00:07

标签: matlab matrix

我想连接一些矩阵(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

怎么了?

1 个答案:

答案 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答案中解释),但这不会改变您正在做的事情可能不会产生最少的事实感。