par для нарезки массива ячеек

При использовании parfor в MATLAB с использованием массивов ячеек я столкнулся с проблемой, когда я не вижу никакой разницы между кодом рабочего примера и моей ошибочной строкой!

Модификация данных может выполняться независимо для каждого работника, и я хотел использовать нарезку переменных, как показано в Блог MathWorks

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

Я делаю точно такое же индексирование первого уровня, как в примере, но 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'), но он не дает мне никаких полезных советов.

Только эта единственная линия разрушает все. Но мне действительно нужно, чтобы эта команда работала. Любые подсказки/обходные пути?


person Stefan    schedule 01.03.2014    source источник


Ответы (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

Если это не помогает, обновите свой вопрос и предоставьте воспроизводимый пример (инициализация всех переменных, полный код)

person Daniel    schedule 01.03.2014
comment
оно работает! действительно здорово, спасибо =) Но я не понимаю, почему это имеет значение для Matlab. Не могли бы вы добавить примечание для этого? - person Stefan; 02.03.2014
comment
Классификация переменных плохо документирована, но она основана на формальном анализе кода. Эти правила иногда не работают. Самый яркий пример: x=foo();y=cell(x,1);parfor ix=1:x... подходит, но y=cell(foo(),1);parfor ix=1:foo()... в большинстве случаев терпит неудачу, когда вы пытаетесь разрезать y. - person Daniel; 02.03.2014