Как вычислить для условия каждое значение в списке (Matlab) - PullRequest
0 голосов
/ 21 октября 2019

Сначала задача просит пользователя записать 20 цифр;тогда все эти значения должны быть оценены с условиями "<0", "== 0" и "> 0" и добавить это значение в другую переменную, такую ​​как "отрицательные числа", "нули", "положительные числа" и, наконец,программа должна отображать список номеров;Я попробовал так:

negatives=[];
positives=[];
zero=[];
inputone=input("first number:");
if inputone==0
zero=[zero,inputone];
elseif inputone>0
positives=[positives,inputone];
elseif inputone<0
negatives=[negatives,inputone];   
end

и так я сделал 20 раз, и это работает, но мне нужно сделать это проще или короче;и меня интересует, как оценить эти 20 чисел, возможно, составить список из всех 20 чисел и создать цикл for для оценки каждого значения списка, но я не нашел никакой информации.

1 Ответ

0 голосов
/ 21 октября 2019

Я не уверен, хотите ли вы, чтобы список чисел (в том виде, в котором он был введен) в этом случае нужно изменить в этом примере кодаЯ написал некоторый код для вас, поскольку кажется, что вы не знакомы с базовыми конструкциями, как для циклов: вы упоминали, что повторяли один и тот же код много раз;если я неправильно понял, пожалуйста, не обращайте внимания на этот пост.

Так что, хотя это и не лучшее решение, по крайней мере, этот код демонстрирует некоторые основные приемы и конструкции, на которые я настоятельно рекомендую обратить внимание:

вы хотитечтобы инкапсулировать вашу логику в элементарные функции, определить основные параметры снаружи, предварительно выделить память (вектор) для производительности, использовать логические индексы для фильтрации компонентов матрицы, использовать цикл for для выполнения повторяющихся функций над перечислением данных (лично я предпочитаю более функциональные конструкции,как cellfun, но Matlab ограничен в своем функциональном стиле, и я думаю, что на данном этапе это только добавит путаницы).

numberOfInputs = 20;

[ negativeVec , zeroVec, positiveVec ] = categorizeInputs(numberOfInputs);


function [negVec, zerVec, posVec ] = categorizeInputs(numberOfInputs)

% pre-allocation: not crucial in this case, but a good habit
negPosMat = zeros(numberOfInputs,2 ) ;

% this is just a counter for the number of zeroes: we do not need to store
% the zeroes since there is only one element; it suffices to store the
% number of occurrences
nzeroes = 0;

% for the number of inputs requested
for iNewInput = 1 : numberOfInputs
    % ask for next input and store into actual number
    actualNumber = input("Insert next number: ");

    % udate matrix of positive and negatives and number of zeros
    % occurrences
    [negPosMat , nzeroes] = updateMatrixOfCategories(actualNumber, negPosMat , nzeroes , iNewInput) ;
end

% create the zero vec (as per user request, but number of occurrences would
% suffice)
zerVec =  zeros(nzeroes ,1) ;

% negative numbers are store on first column: extract only the nonzero
% entries
negVec = negPosMat( negPosMat(:,1) ~= 0 , 1 ) ;

% positive numbers are store on second column: extract only the nonzero
% entries
posVec = negPosMat(negPosMat(:,2) ~=0, 2);

end

function [actualMat, nzeroes] = updateMatrixOfCategories(number, actualMat , nzeroes, rowNumber)
if (number == 0)
    nzeroes = nzeroes + 1; 
elseif number > 0
    actualMat(rowNumber , 2 ) = number;
elseif number < 0
    actualMat(rowNumber , 1) = number; 
end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...