在MATLAB中使用parfor时如何避免单元格

在MATLAB中使用parfor时如何避免单元格,matlab,performance,Matlab,Performance,我有这段代码,我想用parfor代替常规for循环来提高计算时间。当我试图运行代码时,它给出了错误 请建议一个等效的代码,允许我使用下面的代码parfor for i = 1:l % l = size of image data set = 9907 IDB{1,i} = imread(strcat(path,strcat(num2str(i),'.jpg'))); Icolor{1,i} = colorMoments(IDB{1,i}); % 6-features in eac

我有这段代码,我想用parfor代替常规for循环来提高计算时间。当我试图运行代码时,它给出了错误

请建议一个等效的代码,允许我使用下面的代码parfor

for i = 1:l % l = size of image data set = 9907
    IDB{1,i} = imread(strcat(path,strcat(num2str(i),'.jpg')));
    Icolor{1,i} = colorMoments(IDB{1,i}); % 6-features in each cell
    Iwave{1,i} = waveletTransform(IDB{1,i}); % 8-features in each cell
    IglrlFeatures{1,i}  = textureFeatures(IDB{1,i}); % 44-features in each cell
    ICW{1,i} = [Icolor{1,i} Iwave{1,i} IglrlFeatures{1,i}];
end
谢谢


Gopi在循环之前预先分配单元数组大小

IDB = cell(1,l)
Icolor = ...
...
使用
()
而不是
{}
作为单个内存项访问每个单元格。我还将第一个索引从常量
1
更改为文本
。我不确定是哪一个原因导致了错误,但通常情况下,当多维结构不执行
parfor
时,这是因为结构的“切片”与parfor切片表示不对齐。通常情况下,其中一个会使您的代理变得容易访问

for i = 1:l
  IDB(:,i) = imread(...)
  Icolor(:,i) = colorMoments(IDB(:,i)); 
  ...
end

错误是什么?我为每个单元格预先分配了内存,并在内存中使用了IDB{1,I}索引,我使用的程序的时间复杂度从91秒(for loop)提高到31秒(parfor loop)。我不知道为什么IDB(:,I)不起作用,但现在我可以使用parfor循环了,非常感谢..所以出于好奇,当我们在MATLAB上启动并行池时,它说4个工人正在运行,这是什么意思?我们能提供更多的并行工作线程吗?它能更好地提高计算时间吗?这意味着它能为并行进程创建4个线程。您的线程大小受您计算机中的内核数量限制,大多数在2-8范围内,但这肯定会有所不同。每当您创建更多的流程时,您都有可能以通信开销为代价降低加速。一般来说,如果添加了更多线程,则具有大量数据广播到每个线程、线程执行时间短或要运行的进程数少的任务可能会花费更长的时间。感谢您的解释,现在我对并行池有了一点了解