Обновление гистограммы в цикле for без увеличения y-данных - PullRequest
0 голосов
/ 03 июля 2018

Мне не повезло найти это в другом месте на сайте, так что вот моя проблема. Я перебираю около тысячи файлов матов, каждый из которых содержит около 10000 точек данных. Я пытаюсь создать общую гистограмму этих данных, но не очень возможно объединить все эти данные для передачи в историю.

Я надеялся, что смогу создать переменную N и Bin для каждого цикла, используя hist (y), тогда N и Bin будут пересчитаны на следующей итерации цикла с использованием Hist (y_new). И так далее, и так далее. Таким образом, исходные данные не растут, и когда цикл, наконец, заканчивается, я могу просто использовать bar (). Если этот метод не сработает, я очень открыт для других решений.

Также, вероятно, небезопасно предполагать, что данные x будут оставаться постоянными на протяжении каждой итерации. Я использую 2012a.

Спасибо за любую помощь !!

1 Ответ

0 голосов
/ 04 июля 2018

Я думаю, что лучшим решением здесь является циклический просмотр ваших файлов дважды: один раз, чтобы установить ячейки, и один раз, чтобы сделать гистограмму. Но, если это невозможно в вашем случае, вот одноразовое решение, которое требует, чтобы вы заранее установили ширину корзины.

clear; close all;
rng('default') % for reproducibility

% make example data
N = 10; % number of data files
M = 5; % length of data files
xs = cell(1,N);
for i = 1:N
    xs{i} = trnd(1,1,M);
end

% parameters
width = 2;

% main
for i = 1:length(xs)
    x = xs{i}; % "load data"
    range = [min(x) max(x)];
    binsPos = 0:width:range(2)+width;
    binsNeg = fliplr( 0:-width:range(1)-width );
    newBins = [binsNeg(1:end-1) binsPos];
    newCounts = histc(x, newBins);
    newCounts(end) = []; % last bin should always be zero, see help histc

    if i == 1
        counts = newCounts;
        bins = newBins;
    else
        % combine new and old counts
        allBins = min(bins(1), newBins(1)) : width : max(bins(end), newBins(end));
        allCounts = zeros(1,length(allBins)-1);
        allCounts(find(allBins==bins(1)) : find(allBins==bins(end-1))) = counts;
        allCounts(find(allBins==newBins(1)) : find(allBins==newBins(end-1))) = ...
            allCounts(find(allBins==newBins(1)) : find(allBins==newBins(end-1)))  + newCounts;

        bins = allBins;
        counts = allCounts;
    end
end

% check
figure
bar(bins(1:end-1) + width/2, counts)

xFull = [xs{:}];
[fullCounts] = histc(xFull, bins);
fullCounts(end) = [];
figure
bar(bins(1:end-1) + width/2, fullCounts)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...