2013-09-30 2 views
1

Я использую MATLAB. У меня есть вопрос о том, как я могу проверить, что значения матрицы в настоящее время повторяя, как это:Проверьте значение матрицы на MATLAB

A=[ 2 3 2 3 2 3 2 3] 

Если матрица повторите по крайней мере первые два значения для всех столбцов после этого, я хочу AUX = 1. но если нет, то только AUX = 0.

+0

К сожалению, неверно истолкованы вопрос. Удалили мой ответ. Я правильно понимаю, что вы хотели бы, например, «AUX = 1», если 'A = [2 3 4 2 3 4 2 3 4 2 3 4]'? –

+0

Спасибо, что помогли мне. Я хочу, чтобы AUX = 1, если A = [2 3 2 3 2 3] или A = [2 3 2 3 2]. Только если значения повторяются, если нет, (например: A [1 2 3 4 1 2 2 3]) AUX должно быть = 0 –

+0

Что вы подразумеваете под «повторить первые два значения для всех столбцов после»? Каким должно быть значение 'AUX' для' A = [2 3 3 2] '? Что относительно 'A = [2 3 3 3 3 2 3]' или 'A = [2 3 4 4 4 2 3]'? –

ответ

2

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

AUX = ~any(A(3:end) - A(1:end-2)) 

Это Векторизованное решение должно быть намного быстрее, чем без векторизованного раствора, поставляемого @Nirk (для больших A).

В зависимости от используемого приложения может потребоваться включить ловушку ошибки:

if size(A, 2) < 3; error('Input matrix needs to have at least 3 columns'); end 

Примечание см замечания по этому ответу на некоторые альтернативные пути решения дела size(A, 2) < 3.

+0

Я думаю, что здесь есть ошибка с вашими brackeys - не должен ли ваш 'any' включать' == 0' внутри? Кроме того, если это так, то это вернет '1' ошибочно' A = [2 3 2 6 7 8 9 0] ' – Dan

+0

@ Dan Я не вижу проблемы (хотя я только заметил, что у меня была дополнительная избыточная скобка - возможно, это вызывало некоторую путаницу?). Конструкция 'A (3: end) - A (1: end-2)' вернет ненулевое число, если и только если у нас нет повторяющегося двухколоночного шаблона. Кроме того, я подключил ваш пример 'A' к моему методу, и он правильно вернул' AUX = 0'? Вы имели в виду написать что-то другое? –

+1

OK Я вижу - я неправильно понял вопрос, я думал, что он должен пройти что-то вроде A = [2 3 2 3 5], т. Е. До тех пор, пока он повторяется хотя бы один раз. Но ваш (правильный) метод теперь может быть упрощен до этого, я считаю: 'AUX = ~ any (A (3: end) - A (1: end-2))' – Dan

1

Вот еще один простой способ сделать это:

AUX = all(A(1) == A(1:2:end)) && all(A(2) == A(2:2:end)) 

В основном это проверяет, равны ли первый элемент все нечетные элементы, а все четные элементы равны второму элементу.

+0

Спасибо, вычислительное время, чтобы сделать этот код быстро? потому что я хочу лучшего исполнения для этой части. –

+3

@OscarSantacruz Я думаю, что ответ Колина немного быстрее (выполняется только одно векторное сравнение), но вам нужно сравнить оба суиона и убедиться в этом сами. ** Pro tip **: не пытайтесь оптимизировать преждевременно, если это не очевидно для вас. Начните беспокоиться об этом, только когда вы столкнетесь с проблемами производительности, профилируйте свою программу и найдите узкое место. –

+0

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

0

Я хотел бы добавить другой подход. Как я вижу, когда вы просите «повторения», поэтому, возможно, вы хотите повторить один и тот же «шаблон». Для этого легко использовать строковые функции.

A=[1,2,3,4,1,2,3,4,1,2,3] 
position_repetition = strfind(A,A(1:2)) 

Я полагаю, вы могли бы использовать regexp для более сложного рисунка. Как это проверить, будет для самого длинного рисунка, который повторяется:

tmp = regexp(char(A),'(?<group>.+)\1+','names') 
group = double(tmp.group) 

это должно быть, как я понимаю, вопрос - он проверяет, является ли это repetion из первых двух записей:

A=[1,2,3,4,1,2,3,4,1,2,3,4] 
tmp = regexp(char(A),'^(?<group>..)\1+$','names') 
AUX = ~isempty(tmp) 
Смежные вопросы