2015-07-10 2 views
2

Предположим, что вход:Как удалить столбец со всеми теми же элементами в Matlab?

[1 2 3; 
2 3 3; 
3 4 3; 
3 5 3;] 

Ожидаемый результат будет:

[1 2; 
2 3; 
3 4; 
3 5;] 

Причина для удаления третьего столбца происходит потому, что все элементы в третьем столбце одно и то же. Для этого есть функция matlab по умолчанию?

ответ

1
A(:,sum(abs(diff(A)))>0,1) 

"Keep столбцы, где разность больше нуля"

+0

путь проще, чем у меня :) –

+1

Неверно, если 'A = [1 2 3]' или 'A = [1 2 3; 2 3 3] '. – Justin

+0

Хорошая точка. Согласен. – ntough

0

Как насчет:

A = 

    1  2  3 
    2  3  3 
    3  4  3 
    3  5  3 

B = A==repmat(A(1,:),size(A,1),1) 

B = 

    1  1  1 
    0  0  1 
    0  0  1 
    0  0  1 

C = sum(B) == size(A,1) 

C = 

    0  0  1 

A(:,C) =[] 

A = 

    1  2 
    2  3 
    3  4 
    3  5 

В одной строке:

A(:, sum(A==repmat(A(1,:),size(A,1),1)) == size(A,1)) = [] 
+0

Неправильная если 'А = [1 2 3]'. – Justin

+0

@jucestain, какова была бы ваша идея «правильного» результата, если есть только одна строка? –

+0

Каждый элемент в каждом столбце один и тот же, поэтому он должен возвращать пустой вектор. Это называется рефлексивным свойством оператора равенства. – Justin

1

Оба размещены ответы неверны , Проверьте случаи края, где A имеет только 1 или 2 строки:

т.е.:

A = [1 2 3]; 

или:

A = [1 2 3; 
    2 3 3]; 

diff и any необходимости поставляться с правильной размерности:

A = A(:,any(diff(A,1,1),1)); 

Эти выходы:

A = [1 2 3; 2 3 3]; 
EDU>> A(:,any(diff(A,1,1),1)) 

ans = 

    1  2 
    2  3 

и

A = [1 2 3] 
EDU>> A(:,any(diff(A,1,1),1)) 

ans = 

    Empty matrix: 1-by-0 

Кроме того, ИМО это, семантически, имеет наибольший смысл:

A(:,all(bsxfun(@eq,A,A(1,:)),1)) = [] 
+0

Спасибо, что упомянул об этом конкретном случае. Однако в моей задаче матрица ввода всегда имела более чем одну строку, поскольку, если она имеет только одну строку, у нее не будет столбца, который имеет все те же элементы. – ntough

+0

Принятый ответ по-прежнему неверен для случая двух строк. 'A = [1 2 3; 2 3 3] ' – Justin

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