У меня есть цикл, который выполняет итерацию по матрице и устанавливает все строки и столбцы только с одним ненулевым элементом ко всем нулям.Как я могу векторизовать этот цикл в MATLAB
так, например, она будет преобразовать эту матрицу:
A = [ 1 0 1 1
0 0 1 0
1 1 1 1
1 0 1 1 ]
к матрице:
A' = [ 1 0 1 1
0 0 0 0
1 0 1 1
1 0 1 1 ]
строк/столбцов 2 A
имеет только 1 ненулевой элемент в ней, так что каждый элемент в строке/столбце 2 установлено значение 0 в A'
(предполагается, что матрицы всегда будут диагонально симметричными)
вот мой не-vectorised код:
for ii = 1:length(A)
if nnz(A(ii,:)) == 1
A(ii,:) = 0;
A(:,ii) = 0;
end
end
Есть более эффективный способ написания этого кода в MATLAB?
EDIT:
меня попросили в комментариях для некоторых разъяснений, так что я буду принуждать.
Цель этого кода, чтобы удалить ребра из графа, которые ведут к вершине степени 1.
, если A
матрица смежности, представляющая неориентированный граф G
, затем строку или столбец этой матрицы, только один ненулевой элемент указывает, что строка/столбец представляет собой вершину первой степени, так как она имеет только один ребро, инцидентное ей.
Моя цель - удалить такие графы из графика, так как эти вершины никогда не будут посещены в решении проблемы, которую я пытаюсь решить, а уменьшение графика также уменьшит размер ввода для моего алгоритма поиска ,
@TimeString, я понимаю, что в примере, который вы дали, рекурсивное применение алгоритма к вашей матрице приведет к нулевой матрице, однако матрицы, которые я применяю для представления больших связанных графиков, так что никогда не будет такой случай. В ответ на ваш вопрос о том, почему я проверяю только количество элементов в строке, но очищает как столбцы, так и строки; это потому, что матрица всегда по диагонали симметрична, поэтому я знаю, что если что-то верно для строки, значит, это будет для соответствующего столбца ..
так, просто чтобы уточнить, используя другой пример:
Я хочу, чтобы превратить этот график G
:
, представленный матрицей:
A = [ 0 1 1 0
1 0 1 0
1 1 0 1
0 0 1 0 ]
этому графу G'
:
представляемого этой матрица:
A' = [ 0 1 1 0
1 0 1 0
1 1 0 0
0 0 0 0 ]
(я понимаю, что эта матрица должна быть на самом деле матрицей 3х3, потому что точка D была удалена, но я уже знаю, как сжать матрицу, в данном случае, мой вопрос о эффективно настройке столбцов/строк только с 1 ненулевого элемента все на 0)
я надеюсь, что это достаточно хорошее осветление ..
Я чувствую ваш вопрос может противоречить самому себе, плюс ваше решение не решает вопрос, который вы просили. 1) Каков ожидаемый ответ A = [1 1 0; 0 1 1; 0 0 1]? Я думаю, что рекурсивно я должен получить нулевую матрицу. 2) В вашем коде решения, почему вы просто проверяете количество 1 в строке, но также очищаете весь столбец? Уточнить? – TimeString
Понял, вот почему вы сказали, что A симметричен, что я раньше не записывал – TimeString