matlab - तितर बितर साजिश के साथ बड़े 3 डी डेटासेट का दृश्यमान




3d data-visualization (2)

ऐसा लगता है कि timer फ़ंक्शन आपके सिमुलेशन की प्रगति की भावना पाने के लिए और फिर एक बार जब आप चीजों को देखने के साथ संतुष्ट हो जाने के बाद एक एवीआई बनाने के लिए आगे की कोशिश करने के लिए एक अच्छी जगह है।

MATLAB के पास इसके लिए कुछ महान दस्तावेज हैं , जिसमें लगातार कॉल के लिए कई विकल्प उपलब्ध हैं और उनके बीच की रिक्तियां ExecutionMode और Period गुणों को देखें

मैं MATLAB में एक सिमुलेशन चला रहा हूं जिसमें मेरे पास एक बड़ा 3 डी डाटासेट है जो हर बार कदम बदलता है। मैं विभिन्न स्थानों, आकारों, रंगों और पारदर्शिता के स्तरों को लेकर सिमुलेशन आय के रूप में एक 3 डी स्केटर प्लॉट का उपयोग करते हुए डेटा को विज़ुअलाइज़ करने की कोशिश कर रहा हूं। आकार और रंग जानकारी बेमानी है

MATLAB में आंकड़े प्रतिपादित करना और घूर्णन धीमा और तड़का हुआ है। मेरे कंप्यूटर में एक 4 GHz i7-4790 सीपीयू और एक NVIDIA GeForce GTX 750 Ti ग्राफिक्स कार्ड है। मैं विंडोज 7 पर Matlab R2016a का उपयोग कर रहा हूँ। मैं अपने MATLAB ओपनजीएल सेटिंग्स की जाँच की और हार्डवेयर समर्थन स्तर भरा है। (हार्डवेयर ओपन जीएल पारदर्शिता के लिए जरूरी है।) इसके अलावा, मैं GPU-Z का उपयोग करते हुए अपने GPU उपयोग की निगरानी कर रहा हूं, और प्लॉटिंग और रोटेशन के दौरान, केवल 25-30% पर GPU लोड चोटियों।

यहां मेरा कोड नमूना है:

load sample_data2
channels_matrix = cat(1, channels{:});
num_channels = length(channels);
channel_lengths = cellfun(@(x) size(x, 1), channels);

figure(1);
for i = 1:num_channels
    g = plot3(channels{i}(:, 1), channels{i}(:, 2), channels{i}(:, 3), 'k');
    set(g, 'LineWidth', 1.5)
    hold on;
    text(channels{i}(1, 1), channels{i}(1, 2), channels{i}(1, 3), num2str(i))
end
caxis([0 1])
colorbar
drawnow

numDivisions = 8;
ptsPerDivision = numel(grid_x)/numDivisions;
T = 1000;
numplotpts = 2E4;
for t = 1:T
    plot_signal = nan(size(grid_x));
    plot_signal(sort(randsample(numel(grid_x), numplotpts))) =...
        sort(rand(numplotpts, 1));
    tic
    for i = 1:numDivisions
        temp = plot_signal(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
        yplot = grid_y(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
        xplot = grid_x(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
        zplot = grid_z(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
        if t == 1
            h(i) = scatter3(yplot(~isnan(temp)), xplot(~isnan(temp)),...
                zplot(~isnan(temp)), 50*temp(~isnan(temp)), temp(~isnan(temp)), ...
                'filled', 'MarkerFaceAlpha', exp(-i)^0.25);
        else
            h(i).XData = yplot(~isnan(temp));
            h(i).YData = xplot(~isnan(temp));
            h(i).ZData = zplot(~isnan(temp));
            h(i).SizeData = 50*temp(~isnan(temp));
            h(i).CData = temp(~isnan(temp));
        end
    end
    drawnow
    toc
end

और यहां डेटा के लिए एक लिंक है क्या रेंडरिंग को गति देने और रोटेशन को आसान बनाने का कोई तरीका है? मैंने देखा कि एक एकल स्केलर में सभी डेटा बिंदुओं के आकार को ठीक करने से रेंडरिंग और रोटेशन की गति बढ़ जाती है। क्या यह आकार में रखने के लिए संभव है क्योंकि यह कोड में है और अभी भी आंकड़ा प्रस्तुत करना है और जल्दी से घुमाने के लिए?

संपादित करें : एक संबंधित प्रश्न मैंने पोस्ट किया


मुझे यकीन नहीं है कि इससे सभी समस्याएं हल हो जाएंगी, लेकिन पहले चरण के रूप में मैं सभी गणनाओं को लूप से बाहर लेने का सुझाव दूंगा जो कि ड्राइंग के लिए उपयोग किया जाता है। यह एक सुझाव है कि इसे कैसे करें:

load sample_data2
clf
channels_matrix = cat(1, channels{:});
num_channels = length(channels);
channel_lengths = cellfun(@(x) size(x, 1), channels);

figure(1);
for k = 1:num_channels
    g = plot3(channels{k}(:, 1), channels{k}(:, 2), channels{k}(:, 3), 'k');
    set(g, 'LineWidth', 1.5)
    hold on;
    text(channels{k}(1, 1), channels{k}(1, 2), channels{k}(1, 3), num2str(k))
end
caxis([0 1])
colorbar
drawnow

numDivisions = 8;
ptsPerDivision = numel(grid_x)/numDivisions;
T = 1000;
numplotpts = 2E4;

% -> chnages starts here:

% first loop for creating random indices
plot_signal = nan(size(grid_x));
rand_numplotpts =sort(rand(numplotpts,T),1);
rand_inds = zeros(numplotpts,T);
for t = 1:T % one loop for creating random indices
    rand_inds(:,t) = sort(randperm(numel(grid_x),numplotpts));
end
plot_signal(rand_inds(:,t)) = rand_numplotpts(:,t);

% second loop for drawing the first instance:
for k = 1:numDivisions
    temp = plot_signal(dists_idx((k-1)*ptsPerDivision+1:k*ptsPerDivision));
    yplot = grid_y(dists_idx((k-1)*ptsPerDivision+1:k*ptsPerDivision));
    xplot = grid_x(dists_idx((k-1)*ptsPerDivision+1:k*ptsPerDivision));
    zplot = grid_z(dists_idx((k-1)*ptsPerDivision+1:k*ptsPerDivision));
    h(k) = scatter3(yplot(~isnan(temp)), xplot(~isnan(temp)),...
        zplot(~isnan(temp)), 50*temp(~isnan(temp)), temp(~isnan(temp)), ...
        'filled', 'MarkerFaceAlpha', exp(-k)^0.25);
end

% third loop to calculate all timesteps:
[X,Y,Z,S,C] = deal(nan(size(temp,1),numDivisions,T));
for t = 2:T 
    plot_signal(rand_inds(:,t)) = rand_numplotpts(:,t);
    for k = 1:numDivisions
        temp = plot_signal(dists_idx((k-1)*ptsPerDivision+1:k*ptsPerDivision));
        yplot = grid_y(dists_idx((k-1)*ptsPerDivision+1:k*ptsPerDivision));
        xplot = grid_x(dists_idx((k-1)*ptsPerDivision+1:k*ptsPerDivision));
        zplot = grid_z(dists_idx((k-1)*ptsPerDivision+1:k*ptsPerDivision));
        non_nan_inds = ~isnan(temp);
        inds = 1:sum(non_nan_inds);
        X(inds,k,t) = yplot(non_nan_inds);
        Y(inds,k,t) = xplot(non_nan_inds);
        Z(inds,k,t) = zplot(non_nan_inds);
        S(inds,k,t) = 50*temp(non_nan_inds);
        C(inds,k,t) = temp(non_nan_inds);
    end
end

% forth loop to draw all data:
for t = 2:T
    for k = 1:numDivisions
        h(k).XData = Y(:,k,t);
        h(k).YData = X(:,k,t);
        h(k).ZData = Z(:,k,t);
        h(k).SizeData = S(:,k,t);
        h(k).CData = C(:,k,t);
        drawnow
    end
end






scatter-plot