2015-05-11 7 views
1

Предположим, у меня есть (2x10) матрица.Удаление строки в матрице с использованием переменной

Теперь у меня есть функция, чтобы итеративно прокручивать эти строки, выполнять процесс очистки, и, если выполняются некоторые критерии, удалите эту строку. Таким образом, функция возвращает (обычно) строку исходного размера и иногда удаляет эту строку. Таким образом, другими словами, удаление строки выполняется через переменную, возвращаемую функцией.

Однако он выдает ошибку относительно несоответствия размеров.

Таким образом, я могу это сделать:

x(1,:) = []; 

Чтобы удалить первую строку, но:

d = []; 
x(1,:) = d; 

дает ошибку измерения рассогласования. Так что, если я даю:

x(1,:) = cleaning_function(x(1,:)); 

и функция решает удалить строку, он подбросит ошибку измерения рассогласования.

Как решить эту проблему?

+2

Было бы лучше, если бы ваша функция очистки приняла полную матрицу в качестве входных данных и вернула индекс всей строки для удаления ... затем следующую строку кода вы можете проверить, пустой ли результат, если не тогда используйте его, чтобы удалить удаленные строки за один раз. – Hoki

ответ

0

= [] является идиомой и не соответствует обычным правилам назначения (более или менее это интерпретируется как «удалить LHS»). Вот почему твоя идея не работает. Как говорит Хоки, результат, на который вы нацеливаетесь, не был бы самым эффективным. Тем не менее, у вас могут возникнуть другие проблемы, не выявленные в вашем вопросе. Если да, то ближе всего я могу думать о том, чтобы использовать форму, как:

if cleaning_function(x(1, :)) 
    x(1, :) = []; 
end 

Но идея Hoki, либо что-то подобное, будет чище. Например:

rows_to_keep = cleaning_function(x); 
x = x(rows_to_keep, :); 

Или даже:

x = cleaning_function(x) 

с деталями обрабатываются внутренне в цикле. Поскольку Matlab проходит по ссылке, вышеуказанное, как правило, не является накладными расходами.

+0

Нет, Matlab переходит по значению в целом. Приведенный вами пример - это оптимизация для матриц и требует, чтобы переменные ввода/вывода имели одно и то же имя. – Setsu

+0

Я имел в виду, что не было бы дополнительной копии, необходимой для вызова или возврата, как это было в случае с Matlab. Конечно, семантика всегда проходит по значению для простых объектов. Я не знал, что оптимизация перекрестных ссылок была потеряна, если имена были разными. У вас есть ссылка на это? Это кажется очень странным. –

+0

Я получил это из [Матлабцентрального обсуждения] (http://www.mathworks.com/matlabcentral/answers/49390-pass-variable-by-reference-to-function#comment_259555) – Setsu

Смежные вопросы