2015-01-29 6 views
0

Я пытаюсь сделать некоторое время для случайного числа появления «y». Однако цикл while не отображает «результат» или не отображает ничего при появлении запроса. Я получаю только те же случайные числа, сгенерированные первоначально как мой результат. Я хочу добавить второй столбец к моему вектору результата, который показывает вычисление каждого значения X в условиях цикла, по какой-то причине второй столбец не сохраняется. и я просто получаю вектор-столбец «X».Пока цикл не сохраняет результаты

y = round(rand*10); 

x = randi([-5,5],1,y); 
X = x'; 
result=[X]; 

while isempty(result)==1 
    disp('Nothing') 

    if result > 2 
     disp('A') 
     result=[result,result+5]; 
    else 
     disp('B') 
     result=[result,result*0]; 
    end 
end 
+0

Вы знаете, что полуколоны без вывода справа? – chris

+0

Да, это только я подавляю выход.в командной строке я не получаю двухколонный вектор, вместо этого я просто возвращаю те же случайные значения X, что и вектор-столбец, но мне это нужно, но с добавлением столбца с результатами. – Crisp

+1

Я не знаю о MatLab, но 'X = x ';' имеет на нем одну кавычку. – Rafael

ответ

1

Причина, почему ваш код не работает из-за вашего while состояния. В частности, обратите внимание на логику внутри вашего while заявления:

while isempty(result)==1 

Цикл while будет выполняться только если result пуст. Это не так, как result = X в начале вашего кода. Таким образом, цикл while никогда не выполняется.


Учитывая ваше объяснение в ваш комментарий ниже, вы хотите, чтобы сгенерировать случайное число, и каждый раз, когда вы это делаете, вы хотите проверить, если результат больше, чем 2 или нет. Если это так, добавьте 5 к этому элементу и добавьте это как элемент в новый столбец. Если нет, просто замените это на 0.

Я бы предложил использовать цикл for вместо цикла while, потому что вы, вероятно, хотите, чтобы матрица перестала расти после определенной точки.

Таким образом, сделать что-то вроде этого, вместо:

y = round(rand*10); 
result = []; 
x = randi([-5,5],1,y); 

for idx = 1 : y 
    if x(idx) > 2 
     result = [result [x(idx); x(idx)+5]]; 
    else 
     result = [result [x(idx); 0]]; 
    end 
end 

Что вы делаете в первую очередь это вы определить случайное число, которое определяет предел, сколько случайных чисел вы хотите создать. Затем мы объявляем пустой массив, который сохранит наш результат. После этого мы генерируем наши случайные числа, затем мы используем цикл for для циклического перехода по каждому элементу x и проверьте, каково их значение. Если значение равно > 2, мы добавим это число в нашу двумерную матрицу, где ее значение добавляется 5 к новому столбцу. Если нет, то мы просто установите значение 0.

Когда я сделал бег с этим, это то, что я получил за result:

result = 

    5  2 -5  4  5 
    10  0  0  9 10 

Однако, вы можете легко сделать это без for и сделать это полностью векторизованным. Вы можете просто заменить приведенный выше код с:

y = round(rand*10); 
x = randi([-5,5],1,y); 

%// NEW 
result = [x; zeros(1,y)]; 
ind = x > 2; 
result(2,ind) = result(1,ind) + 5; 

Вышеприведенный код делает то, что мы инициализируем result быть 2D массив уже, где первый ряд состоит из тех чисел, сгенерированных случайным образом, а вторая строка имеет пучок нулей. Мы ищем произвольно генерируемые значения > 2, затем используем эти позиции для обновления второй строки, где мы берем те значения, которые удовлетворяют этому условию, и добавляют 5 к каждому значению. Затем мы сохраняем результаты во второй строке. Если вы запустите вышеуказанный код, вы сможете получить те же результаты.

+0

По правде говоря, это технически первый раз, когда я использую цикл while, я всегда использую для циклов в matlab. Но я вижу, что вы говорите, он будет выполняться только в том случае, если результат пуст. Причиной использования цикла while является то, что число событий «Y» будет случайным. Я просто сделаю цикл for, подобный этому, для i = 1: Y. Я больше не буду использовать, пока петли для esp в сложной situtation вот так. – Crisp

+0

@Crisp - Gotcha. Я действительно не уверен, что делает ваш код. Можете ли вы дать немного больше информации о том, какова цель? У меня есть некоторые вопросы о том, как это должно работать (см. Мои правки). Я бы хотел, чтобы вы ушли с кодом, который работает с вашими спецификациями. – rayryeng

+0

В основном я генерирую некоторые случайные числа в виде вектора столбца (один столбец), который является вектором результата. После этого, если какой-либо элемент в моем векторе столбца больше 2, я добавляю к нему 5. если результат меньше или равен двум, он будет равен нулю. поэтому с результатами будет создан второй столбец. например, «result = [-4 -5 3]», после цикла вектор результата будет иметь «result = [-4 -5 3; 0 0 8] '. поэтому -4 и -5 становятся 0, потому что они меньше или равны 2, но вы добавляете 5 к 3, потому что 3 больше 2. – Crisp

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