2014-03-01 35 views
1

在MATLAB中使用單元陣列時使用parfor我進入了一個問題,我看不出任何區別於工作示例代碼和我的越野車線!parfor切片的單元陣列

數據的修改可以indipendently做了每個工人,我想用變量的切片,像顯示在MathWorks Blog

A3 = cell(10,1); 
parfor ix = 1:10 
    for jx = 1:10 
     A3{ix}(jx) = ix + jx; 
    end 
end 
A3 = cell2mat(A3); 

Im做完全相同的第一級索引像的例子,但MATLAB無法對它進行分類。

我想要刪除某些行:每行都有文件文件與其他循環中的某些值進行比較的行(爲簡單起見,未顯示)。爲每個文件分配一名工人。

parfor file=1:length(data(:,1)) 
    line= 1; 
    length_line = length(data{file,1}(:,1)); 

    while line <= length_line && ... && ... 
     % some more loops 
      if (...) 
       data{file,1}(line,:) = []; 
       length_line= length_line - 1; 
      end 
     % end of some more loops 
     line= line + 1; 
    end 
end 
% data will be returned 

我不明白爲什麼它不應該工作!我考慮到:

  • data將被修改,使每個員工的修改有別人沒有交叉影響(刪除行只有實際工作者數據集部分)
  • 的切片索引必須完成第一級(data{file,1}
  • 其他第一級索引變量將被視爲常量/常量,我使用「1」,所以一切都很好。
  • 沒有以後將在外部使用的變量的內部分配分配(甚至不是常量)
  • 沒有行data{file,1}(line,:)= []的測試在沒有Matlab警告的情況下運行。
  • 試過MATLAB靜態代碼分析儀output = mlint('myFile.m')但它沒有顯示任何有用的提示。

只是這一行是分手的一切。但我真的需要這個命令來工作。任何提示/解決方法?

回答

1

你的代碼是不完整的,我沒有嘗試一下,但是這應該修復它:

parfor file=1:length(data(:,1)) 
    line= 1; 
    length_line = length(data{file,1}(:,1)); 
    dataslice=data{file,1} 
    while line <= length_line && ... && ... 
     % some more loops 
      if (...) 
       dataslice(line,:) = []; 
       length_line= length_line - 1; 
      end 
     % end of some more loops 
     line= line + 1; 
    end 
    data{file,1}=dataslice 
end 
% data will be returned 

如果這沒有幫助,請更新您的問題,並提供一個可再現的例子(所有變量的初始化,完整的代碼)

+0

它的工作原理!真的很棒,謝謝=)但我不明白爲什麼這對matlab有所作用。你能爲此添加一個筆記嗎? – Stefan

+0

變量的分類沒有很好的文檔記載,但它基於正式的代碼分析。這些規則有時會失敗。最顯着的例子是:'x = foo(); y = cell(x,1); parfor ix = 1:x ...'可以,但是'y = cell(foo(),1); parfor ix = 1:foo()...'在大多數情況下嘗試切片y時失敗。 – Daniel