2014-03-01 34 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