1

我有一个 3x6 元胞数组的 MATLAB 变量。单元阵列的其中一列最多可容纳 150-200 个小 RGB 图像,例如 16x20 像素大小(同样,最多)。其余列是:

  • 相同数量的标签是 3 或 4 个字符的字符串,

  • 一个图像蒙版,大约 350x200

  • 3 个整数

由于某种原因,保存此对象需要很长时间,或者至少对于对象的大小而言。已经 10 分钟了(这还不算太糟糕,但我计划扩大对象的大小以容纳数千张这些小图像),而 MATLAB 似乎没有取得任何进展。事实上,当我打开变量的包含目录时,它的大小在 0 字节到大约 120kB 之间循环。(即它将以 30 或 40 kB 的步长增加到 120,然后重新启动)。

这是正常行为吗?MATLAB 变量是否总是需要很长时间才能保存?这里发生了什么?

错误:我正在保存AllData,而不是我的 SVM 变量。AllData具有与 SVM keeper 相同的数据,减去实际的 SVM 本身和一个整数。

代码的哪些特定点有助于解决这个问题?代码本身只有几百行,分成几个函数。解决此问题需要考虑哪些重要事项?什么时候创建变量?什么时候保存?我创建较小图像的方式?

讨厌成为给他们的桌面拍照的菜鸟。但是我正在使用的机器在截屏时遇到问题。无论如何,这里是

Alldata/curdata只是 3x7 数组的子集...实际上它是 3x8,但最后一个只是int.

有趣的一点:我中断了保存过程,变量似乎保存得很好。我在保存的数据上训练了一个新svm的,它工作得很好。不过,我不想在未来这样做。 工作区内容

使用谁:

Name                               Size                 Bytes  Class      Attributes

AllData                            3x6                 473300  cell                 
Image                            240x352x3             253440  uint8                
RESTOREDEFAULTPATH_EXECUTED        1x1                      1  logical              
SVMKeeper                          3x8                2355638  cell                 
ans                                3x6                 892410  cell                 
curData                            3x6                 473300  cell                 
dirpath                            1x67                   134  char                 
im                               240x352x3            1013760  single               
s                                  1x1                 892586  struct   

更新: 1.这种情况总是发生,还是你只做过一次?

- 它总是发生

2.保存到不同的(本地)驱动器是否需要相同的时间?

-当我回到那台计算机时,我会对此进行更多调查

3.将一个500kb的矩阵保存到那个文件夹需要多长时间?

- 几乎是瞬间的

4.如上所述,您使用的函数调用是什么?

- 下面添加的代码

(Image is a rgb image)

MaskedImage(:,:,1)=Image(:,:,1).*Mask;
MaskedImage(:,:,2)=Image(:,:,2).*Mask;
MaskedImage(:,:,3)=Image(:,:,3).*Mask;
MaskedImage=im2single(MaskedImage);
....


(I use some method to create a bounding box around my 16x20 image)
(this is in a loop of that occurs about 100-200 times)

 Misfire=input('is this a misfire?','s');
 if (strcmpi(Misfire,'yes'))
    curImageReal=MaskedImage(j:j+Ybound,i:i+Xbound,:);
    Training{curTrainingIndex}=curImageReal;  %Training is a cell array of images
    Labels{curTrainingIndex}='ncr';
    curTrainingIndex=curTrainingIndex+1;
 end


  (the loop ends)...


SaveAndUpdate=input('Would you like to save this data?(say yes,definitely)','s');
undecided=1;
while(undecided)
if(strcmpi(SaveAndUpdate,'yes,definitely'))
   AllData{curSVM,4}=Training;
   AllData{curSVM,5}=Labels;
   save(strcat(dirpath,'/',TrainingName),'AllData'); <---STUCK HERE
   undecided=0;
else
   DontSave=input('Im not going to save. Say YESNOSAVE to NOT SAVE','s')
   if(strcmpi(DontSave,'yesnosave'))
      undecided=0;
   else
      SaveAndUpdate=input('So... save? (say yes,definitely)','s');
   end
end
end
4

2 回答 2

0

有点不清楚您是否正在保存一些自定义文件。如果是第一个,我猜你的保存循环非常慢,可能是一些硬件问题。尝试使用 MATLAB 的save函数保存数据:

tic
save('test.mat', 'AllData')
toc

如果效果很好,请尝试从那里开始工作,例如一次保存一个元素等。

您可以使用 来分析您的代码,使用profiler命令打开它,profile viewer然后在输入文本字段中输入您想要分析的代码、脚本或函数。

于 2012-11-29T13:19:35.110 回答
0

这不是一个很好的答案,但似乎问题在于我在将图像转换为单个图像后保存了它的版本。我不知道为什么这会导致如此显着的减速(在删除这行代码后它立即起作用)所以如果有人可以编辑我的答案以更清楚地了解情况,那将不胜感激。

于 2012-11-29T15:54:37.797 回答