Необходимо проанализировать набор векторов с 0 и натуральными числами - PullRequest
1 голос
/ 06 октября 2011

Я использую Matlab, и у меня есть вектор чисел 1x200.

Мне нужно присвоить «счет» для набора чисел, следуя этим правилам:

  1. Если есть 2, 3 или 4 последовательных положительных числа, то 0,5 балла
  2. Если есть пять или более последовательных положительных чисел, то 1,0 балла
  3. Если нет последовательных положительных чисел, например: 0 0 0 6 0 0, то 0,0 балла. (игнорируйте его, считайте, что положительное число равно нулю)
  4. Если в середине ряда натуральных чисел есть только один ноль, игнорируйте этот ноль (считайте его положительным целым числом)
  5. Если имеется два или более последовательных нуля, означает, что прерывает последовательность последовательных положительных чисел.

Пример: 30 43 54 0 0 0 41 54 14 10 1 0 0 0 0 32 41 98 12 0 0 0 (всего 2,0 балла)

В конце должно быть подсчет очков.

Есть ли какие-нибудь полезные функции для этого типа проблемы?

Ответы [ 2 ]

0 голосов
/ 07 октября 2011

Как насчет:

str = repmat('a', 1, numel(testData));
str(testData > 0) = 'b';
m = regexp(str, 'b+(ab+)*', 'match');
n = cellfun(@numel, m);
score = 0.5 * sum(n >= 2 & n <= 4) + 1.0 * sum(n >= 5);

Обратите внимание, что я не запускал это, поэтому могут быть ошибки.

0 голосов
/ 06 октября 2011

Это основано на моем понимании вопроса, как отмечено в моем вопросе выше. Я «не подавил» весь вывод, чтобы вы могли видеть, что происходит.

%Rules:
%1. If there are 2 or 3 or 4 consecutive positive numbers, then 0.5 point
%2. If there are five or more consecutive positive numbers, then 1.0 point
%3.  And if there isn't any consecutive positive number, for example: 
%   0 0 0 6 0 0, then 0.0 point. (ignore it, consider that positive 
%   number as zero)
%4. if there is only one zero in the middle of positive integers = ignore 
%   that zero (consider it as a positive integer)
%5. If there are two or more consecutive 0, THEN no point.

%testData = [0 30 43 54 0 0 0 41 54 14 10 1 0 0 0 0 32 41 98 12 0 0 0 1 2 0 1 2 0 ];
testData = [30 43 54 0 0 0 41 54 14 10 1 0 0 0 0 32 41 98 12 0 0 0 ];
posa = testData>0;
%add 0s at each end so that the diffs at the ends work.
diffa = diff([0 posa 0])
starts = find(diffa ==1)
ends = find(diffa==-1)

% Rule 4 if any end (-1) is immediately followed by a start, that means that there 
%   is a 0 in the middle of a run.  substitute a 1 in the position and recalc.
midZeroLengths = starts(2:end) - ends(1:(end-1));
%pad to account for the fact that we only compared part.
midZeroLengths = [midZeroLengths 0];
if any(midZeroLengths == 1);
    testData(ends(midZeroLengths==1)) = 1;
    posa = testData>0;
    %add 0s at each end so that the diffs at the ends work.
    diffa = diff([0 posa 0])
    starts = find(diffa ==1)
    ends = find(diffa==-1)  
end

runs = ends-starts
halfs = (runs > 1) & (runs < 5)
wholes = (runs > 4)
final = sum(halfs)*0.5 + sum(wholes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...