2016-04-03 2 views
0

Я написал небольшой код в Octave, и часть его проверяет, равны ли значения в первых строках двух матриц, и если да, добавив значение второй строки второй матрицы к значению второй строки первой матрицы.Как сократить время выполнения, заменив цикл while?

Это та часть кода, который я написал, используя небольшой набор данных:

PositionLoadArray = 
1 5 3 7 4 6 9 2 1 2 
1 2 3 4 5 6 7 8 9 10 

X = 
0 1 2 3 4 5 6 7 8 9 
0 0 0 0 0 0 0 0 0 0 

x=1; #row number in matrix X 
y=1; #row number in matrix PositionLoadArray 

while y<=columns(PositionLoadArray) 

    if PositionLoadArray(1,y)==X(1,x) 
     X(2,x)=X(2,x)+PositionLoadArray(,y); 
     y=y+1; 
     x=1;  
    else  
     x=x+1;  
    endif 

endwhile 

Это дает результат:

X = 
0 1 2 3 4 5 6 7 8 9 
0 10 18 3 5 2 6 4 0 7 

прогонов цикла и отлично работает для малых (например, где общее количество столбцов для X и PositionLoadArray (максимальные значения x и y соответственно) малы). Но цикл должен выполняться с большими значениями.

Как уменьшить время выполнения и получить тот же результат?

ответ

0

Попробуйте

X(2, X(1,:) == Y(1,:)) += Y(2, X(1,:) == Y(1,:)) 
+0

@ Matt Вы правы это не так. Однако указанный код в вопросе определенно написан в Octave, а не в MATLAB. Функция 'columns' доступна только в Octave, которая возвращает общее количество столбцов в матрице. Я удалил тег MATLAB. – rayryeng

+0

@rcpinto Это дает мне такой же результат, как если бы мой код сказал «если PositionLoadArray (1, any (y)) == X (1, ​​x)». Что это было, когда вы читали вопрос. Я думаю, что тот, кто редактировал мой вопрос, добавил эту часть. Вы знаете, как решить проблему сейчас? –

+0

@rayryeng Nice catch. Очевидно, Октав, ОР отредактировал вопрос соответственно. – Matt

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