سؤال

لقد بدأت البرمجة في MATLAB ولدي بعض المشاكل في إنشاء مصفوفة عازلة.أحاول القيام بما يلي:

أحصل باستمرار على صورة من كاميرا الويب وبعد التجزئة أحصل على النقطه الوسطى لهدف متحرك.أحتاج إلى تخزين بيانات النقطه الوسطى للمعالجة ولكني لا أريد أن تشغل مساحة كبيرة من الذاكرة.على سبيل المثال، إذا كنت وقتا t=inf, ، كنت أفكر في تخزين 10 نقاط زمنية من البيانات في مصفوفة، مثل المخزن المؤقت الدائري، ثم كتابة ومحو البيانات القديمة، لأنني بحاجة إلى العمل مع كليهما، البيانات الفعلية في الوقت المناسب (t) والبيانات السابقة في الوقت المناسب ( ر-1).

هل كانت مفيدة؟

المحلول

buffSize = 10;
circBuff = nan(1,buffSize);
for newest = 1:1000;
    circBuff = [newest circBuff(1:end-1)]
end

ولقد جربت هذا، فإنه يأخذ أي وقت من الأوقات ملموس للتشغيل في MATLAB. وقال إن التعريف لا تجد أي اختناقات مع التعليمات البرمجية.

نصائح أخرى

تحديث:

منذ أن فهمت الآن أنك بحاجة إلى دائري المخزن المؤقت لتخزين البيانات، إليك الحل الذي يمكنك استخدامه.نظرًا لأنك قلت أنك تقوم بتخزين بيانات النقطه الوسطى للكائنات في صورة ما، فسوف أعطيك حالة عامة لتخزين عدد عشوائي من القياسات (إما قيمة فهرس 1 بكسل لكل نقطة مركزية، أو قيمتين لإحداثيات x و y، وما إلى ذلك) ...

أولاً، قم بتهيئة المخزن المؤقت:

nBuffer = 10;  % You can set this to whatever number of time points
               %   you want to store data for
nSamples = 2;  % You can set this to the number of data values you
               %   need for each point in time
centroidBuffer = zeros(nSamples,nBuffer);  % Initialize the buffer to zeroes

بعد ذلك، سيكون لديك حلقة مستمرة.يمكنك استخدام أ حائط اللوب ومتغير العلم الذي له القيمة في البداية حقيقي (والتي يمكنك ضبطها على خطأ شنيع لإيقاف الحلقة):

keepLooping = true;
while keepLooping,
  % Capture your image
  % Compute the centroid data and place it in the vector "centroidData"
  centroidBuffer = [centroidBuffer(:,2:end) centroidData(:)];
  % Do whatever processing you want to do on centroidBuffer
  % Choose to set keepLooping to false, if you want
end

يعمل هذا بالطريقة التالية:في كل نقطة زمنية، العمود الأول (أي.أقدم البيانات) في com.centroidBuffer تتم إزالة وعمود جديد (أي.البيانات الجديدة) يتم إلحاقها بالنهاية.بهذه الطريقة، تكون مصفوفة المخزن المؤقت بنفس الحجم دائمًا.

إذا كنت لا ترغب في إجراء المعالجة في كل خطوة، ولكن بدلاً من ذلك فقط بعد كل خطوة nBuffer نقاط زمنية بحيث يتم التشغيل على مجموعة جديدة من البيانات في كل مرة، ثم استبدل الكود أعلاه بما يلي:

keepLooping = true;
processTime = 0;
while keepLooping,
  % Capture your image
  % Compute the centroid data and place it in the vector "centroidData"
  centroidBuffer = [centroidBuffer(:,2:end) centroidData(:)];
  processTime = processTime+1;
  if (processTime == nBuffer),
    % Do whatever processing you want to do on centroidBuffer
    processTime = 0;
  end
  % Choose to set keepLooping to false, if you want
end

يحرر:

هناك عدد من الاختلافات التي يمكنك إجراؤها باستخدام الكود أعلاه.على سبيل المثال، إذا كنت تريد تخزين مجموعتين من البيانات تحتوي كل منهما على 10 نقاط زمنية، فيمكنك التغيير nBuffer إلى 20 لتخزين المجموعة القديمة في أول 10 أعمدة والمجموعة الجديدة في آخر 10 أعمدة.ثم قم بتغيير عبارة if إلى:

  ...
  if (processTime == nBuffer/2),
  ...

والآن يمكنك إجراء المعالجة باستخدام المجموعة الأقدم المكونة من 10 نقاط بيانات (في سنترويدBuffer(:,1:10)) والمجموعة الأحدث المكونة من 10 نقاط بيانات (في سنترويدBuffer(:,11:20)).

وعندما كنت أتحدث عن مجموعات كبيرة من البيانات على كل التكرار، يمكن خلط البيانات يبدأ تناول بعض الوقت. الطريق الأول التعامل معها لمجموعات البيانات الكبيرة لاستخدام شيء من هذا القبيل:

وcircBuff (:،:، وزارة الدفاع (العداد، numFrames)) = newData. وبهذه الطريقة يمكنك الكتابة فقط البيانات مرة واحدة، بدلا من الانتقال كل نقطة من نقاط البيانات في المخزن الخاص بك كامل على كل دورة. عليك أن تكون أكثر قليلا من الدهاء حول كيفية الوصول إلى البيانات الخاصة بك.

وHTH، دان

centroidBuffer = [centroidBuffer(:,2:end) centroidData(:)];

وهذا هو الحل لطيفة وبسيطة، لكنها بطيئة. في كل مرة قمت بإضافة ناقلات جديدة، ماتلاب ديه لنسخ البيانات القديمة كلها باستثناء الإدخال الأول. إذا كنت تفكر في الوقت الحقيقي، وهذه ليست فكرة جيدة.

circBuff(:,:,mod(counter,numFrames)) = newData

وهذه الفكرة ليس لديها من المشاكل نسخة، ولكن الآن لم يكن لديك لطيفة subarray أي أكثر، وهو ما يمثل من المؤشر الأول للمؤشر آخر البيانات في الترتيب الزمني.

ولقد تم تحميلها حل بلدي لمنطقة عازلة دائري سريع والذي يتجنب المشاكل اثنين إلى

http://www.mathworks.com/matlabcentral/fileexchange/47025 -circvbuf م

والفكرة الرئيسية لهذا المخزن المؤقت دائري ثابتة وأداء سريع وتجنب عمليات النسخ عند استخدام المخزن المؤقت في برنامج:

% create a circular vector buffer
    bufferSz = 1000;
    vectorLen= 7;
    cvbuf = circVBuf(int64(bufferSz),int64(vectorLen));

% fill buffer with 99 vectors
    vecs = zeros(99,vectorLen,'double');
    cvbuf.append(vecs);

% loop over lastly appended vectors of the circVBuf:
    new = cvbuf.new;
    lst = cvbuf.lst;
    for ix=new:lst
       vec(:) = cvbuf.raw(:,ix);
    end

% or direct array operation on lastly appended vectors in the buffer (no copy => fast)
    new = cvbuf.new;
    lst = cvbuf.lst;
    mean = mean(cvbuf.raw(3:7,new:lst));

وتحقق لقطة أن نرى، أن هذا المخزن المؤقت دائري مزاياه إذا كان المخزن المؤقت كبير، ولكن حجم البيانات لإلحاق كل مرة صغير إلى أداء circVBuf لا تعتمد على حجم المخزن المؤقت، بالمقارنة مع نسخة بسيطة العازلة.

ووالتخزين المؤقت المزدوج garanties وقت التنبؤي لإلحاق اعتمادا على البيانات لإلحاق في أي حالة. في المستقبل سوف هذه الفئة تعطيك خيار لالتخزين المؤقت المزدوج نعم أو لا - الأمور سوف تسريع، إذا كنت لا تحتاج إلى وقت garantied.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top