2012-05-30 1 views
3

Я стараюсь изо всех сил и не использую петли в Matlab, но иногда мне это очень сложно.Векторизация цикла MATLAB

Например, я написал этот код:

vector = zeros(p,1); 

diagDominantFlag = 1; 
for row = 1:p 
    for col = 1:q 
     if(row ~= col) 
      vector(row) = vector(row) + A(row,col); 
     end 
    end 
    if(A(row,row) <= vector(row)) 
     diagDominantFlag = 0; 
     break; 
    end 
end 

Можно ли векторизации, что двойной for цикл?

Благодаря

+2

Я отредактировал вопрос, так как «разрыв» цикла означает нечто совершенно иное, чем «векторизация» его. – NPE

ответ

2

не ответ на прямой вопрос, но вот тест loopless для диагонального преобладания (так как вы, кажется, заинтересованы в том, что):

all(diag(A) >= (sum(abs(A),2)-abs(diag(A))) 

или строгое диагональное преобладание:

all(diag(A) > (sum(abs(A),2)-abs(diag(A))) 

Кроме того, в приведенном выше коде убедитесь, что вы делаете abs() по недиагональным значениям.

+0

+1 для наблюдения 'abs()'. Тем не менее, я буду придерживаться исходного кода OP в своем ответе ... –

+0

@EitanT Я изначально думал то же самое, но я никогда не видел определения диагонального доминирования, которое не хотело 'abs()' –

2

Вы можете заменить внутреннюю петлю

vector(row) = sum(A(row, :)) - A(row, row); 

и на самом деле вы можете заменить все это на

vector = sum(A, 2) - diag(A); 

Чтобы добавить проверку, вы должны во внешнем контуре , вы можете сделать что-то вроде

f = find(diag(A) <= vector); 
if length(f) > 0 
    diagDominantFlag = 0; 
    vector(f(1):end) = 0; 
end 
+0

+1 для расчета 'vector'. Внутренний цикл может быть заменен на векторный вид, хотя ... –

+0

Какой внутренний цикл? В вопросе OPs? Этот цикл заполняет векторную переменную, поэтому я не вижу, как это заменит сравнение .. можете ли вы уточнить? – Ansari

+0

Извините за непонимание. Я хотел сказать, что все испытания могут быть заменены одним логическим векторизованным сравнением. Обратите внимание, что флаг сохраняет значение 1 только в том случае, если каждый элемент в диагонали больше или равен соответствующему элементу в 'vector'. Это называется диагональным доминированием. –

2

Добавление ответа Ансари, то diagDominantFlag можно рассчитать по:

diagDominantFlag = all(diag(A) >= (sum(A, 2) - diag(A))); 

Таким образом, заменив свой двойной for петлю с однострочника.

+0

Okay , это действительно приятно. Я попытаюсь удалить все циклы из моего кода. – ron

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

  • Нет связанных вопросов^_^