2015-07-07 1 views
-1

Ниже приведена моя функция MATLAB, и в ней есть некоторая ошибка, поэтому пожелайте, чтобы любой эксперт мог исправить или указать на ошибку и способ ее улучшить. Я с помощью MATLAB R2015aОшибка кода MATLAB

function L = remove_all(L,E) 
% remove_all(List,element) - delete all occurrences of E from L 
for Index = length(L.elements):-1:1 
    if isequal(E,L.elements{Index}) 
     L.elements(Index) = []; 
    end 
end 
+2

Мы не против читателей. ** Что именно представляет собой ошибка MATLAB? ** Также дайте ожидаемые входы и выходы. Во-первых, я не знаю, что такое 'L', и что должно содержать поле' elements'. – rayryeng

+2

Согласен, вопрос будет намного лучше, если вы отредактируете его, чтобы объяснить, что вы ожидали увидеть и что вы на самом деле видите. – paisanco

+1

Какая ошибка вы получили ...? Пожалуйста, укажите это в сообщении. –

ответ

2

Вы мутируют структуру в цикле for путем удаления элементов в этой структуре, но забывая о том, что длина изменения структуры, как вы удаляете элементы. Таким образом, длина структуры уменьшает с каждым удалением, и вы, в конечном счете, выходите из пределов при удалении элементов. В частности, вы использовали length, чтобы зафиксировать начальную длину списка, но по мере удаления элементов эта длина уже не совпадает и цикл for не знает этого факта. Таким образом, вы в конечном итоге получите ошибку вне границ из-за этого ошибочного удаления элементов.

Способ решения этой проблемы было бы сохранить все места, которые должны быть удалены из структуры и, когда цикл for делается, удалить их все сразу:

function L = remove_all(L,E) 
% remove_all(List,element) - delete all occurrences of E from L 
indices = []; %// New - keep the locations that need to be removed 
for Index = length(L.elements):-1:1 
    if isequal(E,L.elements{Index}) 
     indices = [indices; Index]; %// Add to list if equal 
    end 
end 
L.elements(indices) = []; %// Remove all entries at once 
2

Хотя ответ rayryeng наведен из ошибки и исправить ее, но я все равно хочу попробовать версию 1-линейный код с cellfun:

function L = remove_all(L,E) 
% remove_all(List,element) - delete all occurrences of E from L 
L.elements(cellfun(@(x) x == E, L.elements)) = []; 
end 
+2

Любопытно, как это сравнивается в производительности с циклом 'for'. 'cellfun' по существу представляет собой петлю под капюшоном ... но очень хорошо :) – rayryeng