Сохранение и идентификация элементов в массиве, которые удовлетворяют порогу в MATLAB

У меня есть матрица (около 342 на 342), обозначенная C_{ij}, и я хочу идентифицировать все индексы i, j, которые удовлетворяют условию C_{ij} > rho, где rho — некоторое фиксированное значение. Я использую МАТЛАБ

Например, если у меня есть матрица C_{ij} как:

C = 1     0.7    0.8
    0.7   1      0.5
    0.8   0.5    1

И rho = 0,6, то индексы, удовлетворяющие условию C_{ij} > 0,6, это i,j = 1,2, поскольку C_{11}=C_{22}=1 и C_{12}=C_{21}=0.7 Но обратите внимание, что i,j=3 не удовлетворяет этому условию, поскольку хотя C_{13}=C_{31}=0.8, C_{23}=C_{32}=0.5

Я не уверен, как/лучший способ сделать это в MATLAB?


person Ansh    schedule 19.01.2016    source источник
comment
Ваш вопрос не ясен. По какому критерию включать или не включать данную пару i,j в результат? Всегда ли C симметричен?   -  person Luis Mendo    schedule 19.01.2016
comment
@LuisMendo Я прочитал, что критерий должен быть больше, чем rho, и является ли C симметричным или нет, на самом деле не имеет значения, кроме того, что если он симметричен, вы можете использовать [rowt,colt,~] = find(triu(C)>rho]; row = [rowt;colt]; col = [colt;rowt]. Я не уверен, что это быстрее, чем простое использование логики на полной матрице.   -  person Adriaan    schedule 19.01.2016
comment
@Adriaan Возможно, вы правы, так как у вас уже есть 4 голоса :-) Но я не понимаю, как C(2,3) влияет на решение для i=3, j=3 согласно OP   -  person Luis Mendo    schedule 19.01.2016
comment
Голоса за ни в коем случае не являются способом определить, прав ли кто-то или нет #34725330">например. здесь ;). Я думаю, что ОП не уверен в структуре строк/столбцов и в том, работают ли с ними операторы.   -  person Adriaan    schedule 19.01.2016
comment
@ Адриан Хм ... ты завидовал трехбуквенному ответу Рэя, не так ли? :-)   -  person Luis Mendo    schedule 19.01.2016
comment
Всегда ли верхний левый/нижний правый углы квадратной подматрицы расположены по диагонали, или у вас может быть подматрица, ограниченная C(2,1),C(3,2)?   -  person beaker    schedule 19.01.2016


Ответы (1)


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, но я бы предостерег от используя i или j в качестве переменной. 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);
person Adriaan    schedule 19.01.2016
comment
and I want to identify all indices i,j which satisfy the condition - person Andras Deak; 19.01.2016
comment
@AndrasDeak сохраняет и идентифицирует в соответствии со своим титулом, теперь он делает и то, и другое - person Adriaan; 19.01.2016
comment
@Adriaan @AndrasDeak Да, матрица всегда симметрична. хотя я бы предпочел метод, который этого не предполагает. Возможно, я не правильно объяснил свой критерий. Используя матрицу в моем исходном вопросе в качестве примера, этот первый код будет идентифицировать k и l как 1, 2 и 3. Однако это будет включать элементы C(2,3) и C(3,2), которые оба являются ‹ rho. Надеюсь, это немного прояснит ситуацию. Это довольно сложно объяснить без LaTeX - person Ansh; 19.01.2016
comment
@Ansh, этот код не будет включать эти элементы, поскольку они не превышают пороговое значение. - person Adriaan; 19.01.2016
comment
@Ansh Вы пробовали вышеуказанное (общее) решение на конкретной матрице? Что заставляет вас думать, что он вернет индексы, соответствующие значениям, нарушающим сравнение? - person Andras Deak; 19.01.2016
comment
@ Адриан, ах, теперь я вижу путаницу (отчасти потому, что я сам запутался). Я должен указать, что, поскольку C(2,3) и даже C(3,2) не удовлетворяют условию, я хочу, чтобы из исходной матрицы был сохранен только следующий блок: [1 , 0,7 ; 0.7 , 1] - т.е. для этого случая элементы C(1,1), C(2,2), C(1,2) и C(2,1), т.е. в данном конкретном случае верхний левый блок 2 на 2 . - person Ansh; 19.01.2016
comment
@AndrasDeak Да, я действительно пробовал это решение для матрицы, указанной в моем вопросе. Надеюсь, мой комментарий выше прояснит ситуацию лучше. - person Ansh; 19.01.2016
comment
@ Ответ Анша Адриана не дает вам C(3,2), но C(3,1) дает. Это ваша проблема? Тогда вам нужны не отдельные элементы, а целые прямоугольные блоки, которые соответствуют условию. Это то, что вы хотите? Подматрицы, заданные C(indexvector1,indexvector2)? Если да, вам нужно действительно перефразировать свой вопрос, так как это гораздо более сложная проблема и требует другого решения. - person Andras Deak; 19.01.2016
comment
@Ansh Разъяснения должны быть отредактированы в вашем вопросе. Если ваш вопрос не является самодостаточным и неясным, его следует закрыть. - person beaker; 19.01.2016
comment
@AndrasDeak - теперь вопрос был отредактирован, чтобы было понятнее, чего я именно хочу. Это помогает? - person Ansh; 19.01.2016
comment
@Ansh почти: квадратная или прямоугольная подматрица? Может ли результат быть неквадратным? - person Andras Deak; 19.01.2016
comment
@AndrasDeak Нет, подматрица должна быть квадратной, учитывая то, как я хочу, чтобы пороговое условие работало. - person Ansh; 20.01.2016