2016-01-19 1 views
-1

У меня есть матрица (около 342 на 342), обозначенная C(i,j), и я хочу идентифицировать квадратную подматрицу оригинала в соответствии с условием C(i,j) > rho. Я использую MATLABИдентификация квадратной подматрицы элементов в массиве, которая удовлетворяет порогу в MATLAB

Например, если у меня есть матрица C(i,j) как:

C = 1  0.7 0.8 
    0.7 1  0.5 
    0.8 0.5 1 

и Ро = 0,6 тогда правильный квадрат подматрицы я хочу, чтобы мой код, чтобы определить, является:

C'= 1  0.7 
    0.7 1 

Я не уверен, как/лучший способ сделать это в MATLAB? Хотя матрицы, с которыми я работаю сейчас, являются симметричными, я бы предпочел решение, которое не предполагает этого.

+0

'[K, L] = найти (C> Rho);' –

+0

Ваш вопрос не понятно. Каков критерий включения или отсутствия данной пары 'i, j' в результате? Является ли 'C' всегда симметричным? –

+0

@ LuisMendo Я прочитал критерий как «должен быть больше, чем rho», и является ли 'C' симметричным или нет, не имеет особого значения, кроме того, если он симметричен, вы можете использовать' [rowt, colt, ~] = find (triu (C)> rho]; row = [rowt; colt]; col = [colt; rowt] '. Я не уверен, что это быстрее, чем просто использование логического в полной матрице. – Adriaan

ответ

7
C = rand(342,342); 
rho = 0.6; 
res = C(C>rho); %// contains all values that are above the threshold 
[row,col,val] = find(res); %// returns the indices. 

row будет содержать ваш I, col ваш J, но я бы предостеречь от using i or j as a variable. val содержит соответствующее значение, но вы можете опустить это для освобождения ОЗУ, так как вы можете использовать C(row,col), а также для получения значений.

Если матрица симметрична вы можете использовать это:

[rowt,colt,val] = find(triu(C)>rho); %// find only in the upper triangle 
row = [rowt;colt]; %// flip rows and columns to obtain all results 
col = [colt;rowt]; %// flip rows and columns to obtain all results 

Для вашего редактирования:

IdxR = find(diff(unique(rows))==1,1,'first'); 
IdxC = find(diff(unique(columns))==1,1,'first'); 
Result = C(1:IdxR,1:IdxC); 
+0

", и я хочу идентифицировать все индексы i, j, которые удовлетворяют условию" –

+1

@AndrasDeak "сохранение и идентификация" в соответствии с его названием, теперь он выполняет как – Adriaan

+0

@Adriaan @AndrasDeak. Да, матрица всегда симметрична. хотя я бы предпочел метод, который не предполагает этого. Возможно, я не правильно объяснил свой критерий. Используя матрицу в моем исходном вопросе в качестве примера, этот первый код будет идентифицировать 'k' и' l' как 1, 2 и 3. Однако это будет включать в себя элемент 'C (2,3)' и 'C (3,2), которые оба Ansh

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