仅通过矩阵转置内存不足

Ras*_*hid 5 database matlab database-design signal-processing octave

我有一个单元格,Data它包含三个数组,

 Data = 

[74003x253 double]    [8061x253 double]    [7241x253 double]
Run Code Online (Sandbox Code Playgroud)

我正在使用循环来读取这些数组并执行一些函数,

for ii = 1 : 3
    D = Data {ii} ;
    m = mean (D') ;
    // rest of the code
end
Run Code Online (Sandbox Code Playgroud)

哪个得到警告mean并说:

考虑为MEAN使用不同的DIMENSION输入参数

但是当我改成它时,

for ii = 1 : 3
    D = Data {ii}' ;
    m = mean (D) ;
    // rest of the code
end
Run Code Online (Sandbox Code Playgroud)

的内存不足错误.

比较两个代码,有人可以解释会发生什么吗?

似乎我只用复共轭转置得到了错误(我的数据是真正有价值的).

pat*_*rik 8

为了获得第n维的平均值,可以mean(D,n)如已经说明的那样使用.关于内存消耗,我使用windows资源管理器进行了一些测试监控.产量有点预期.

在进行操作时,D=Data{ii}只消耗最小内存,因为这里matlab只是复制指针.但是,在进行转置时,matlab需要分配更多的内存来存储矩阵D,这意味着内存消耗会增加.

但是,这仅仅不会导致内存溢出,因为转置是在两种情况下完成的.

情况1

单独进来D = Data{ii}';

案例2

D = Data {ii}; m = mean(D');

不同之处在于,在案例2中, matlab仅创建一个临时副本,Data{ii}'而该副本未存储在工作区中.分配的内存在两种情况下都是相同的,但是在存储的情况下 Data{ii}'1D.当内存稍后增加时,这可能导致内存溢出.

内存消耗D并不是那么糟糕(<200 Mb),但猜测是内存已经很高并且这足以让内存溢出.


cha*_*pjc 6

警告信息意味着代替,

m = mean (D') ;
Run Code Online (Sandbox Code Playgroud)

你应该做:

m = mean (D,2);
Run Code Online (Sandbox Code Playgroud)

这将采用第二维的平均值,为您留下长度为的列向量size(D,1).

我不知道为什么你这样做时只会出现内存不足错误D = Data {ii}'.也许这是因为当你把它放在一边时mean(m = mean (D') ;JIT设法以某种方式进行优化并节省你浪费的内存.

  • @Kamtal:每当阅读MATLAB文档时,短语"...在第一个非单一维度上操作"意味着操作是["缩减,折叠或多输入单输出操作符"](http:/ /en.wikipedia.org/wiki/Fold_(higher-order_function)),并且操作员将从"第一个非单一维度"中取出的元素组合在一起. (2认同)
  • 如果我不得不猜测,"D = Data {i}"实际上在将数据传递给"mean(D)"之前创建了一个完整的数据转置副本.另一方面,`D = Data {i}`首先创建一个共享数据副本(想想懒惰的写时复制),然后调用`mean(D')`传递一个"临时"表达式,这是JIT优化的一个可能目标(通过识别'mean`可以计算结果而不在新副本中实际转置矩阵,它足以以适当长度的步幅遍历现有矩阵) (2认同)