سؤال

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

لدي مصفوفة ثنائية الأبعاد، vals، تمثل بيانات السلاسل الزمنية.الصفوف عبارة عن تواريخ، والأعمدة عبارة عن سلاسل مختلفة.أحاول تجميع البيانات حسب الأشهر لإجراء عمليات مختلفة عليها (المجموع والمتوسط ​​وما إلى ذلك).هنا هو قانون بلدي الحالي:

allDts; %Dates/times for vals.  Size is [size(vals, 1), 1]
vals;
[Y M] = datevec(allDts);
fomDates = unique(datenum(Y, M, 1)); %first of the month dates

[Y M] = datevec(fomDates);
nextFomDates = datenum(Y, M, DateUtil.monthLength(Y, M)+1);

newVals = nan(length(fomDates), size(vals, 2)); %preallocate for speed

for k = 1:length(fomDates);

السطر التالي هو عنق الزجاجة لأنني أسميه مرات عديدة. (حلقات)

    idx = (allDts >= fomDates(k)) & (allDts < nextFomDates(k));
    bucketed = vals(idx, :);
    newVals(k, :) = nansum(bucketed);
end %for

أيه أفكار؟شكرا لك مقدما.

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

المحلول

هذه مشكلة صعبة في التوجيه.يمكنني أن أقترح طريقة للقيام بذلك باستخدام سيلفون, ، لكن لا يمكنني ضمان أنه سيكون أسرع لمشكلتك (سيتعين عليك تحديد وقتها بنفسك على مجموعات البيانات المحددة التي تستخدمها).كما نوقش في هذا السؤال SO الآخر, ، ناقلات لا دائماً العمل بشكل أسرع من الحلقات.يمكن أن تكون مشكلة محددة للغاية وهو الخيار الأفضل.مع إخلاء المسؤولية هذا، سأقترح عليك حلين لتجربتهما:إصدار CELLFUN وتعديل لإصدار for-loop الخاص بك والذي قد يعمل بشكل أسرع.

حل سيلفون:

[Y,M] = datevec(allDts);
monthStart = datenum(Y,M,1);  % Start date of each month
[monthStart,sortIndex] = sort(monthStart);  % Sort the start dates
[uniqueStarts,uniqueIndex] = unique(monthStart);  % Get unique start dates

valCell = mat2cell(vals(sortIndex,:),diff([0 uniqueIndex]));
newVals = cellfun(@nansum,valCell,'UniformOutput',false);

الدعوة الى MAT2CELL مجموعات صفوف فالس التي لها نفس تاريخ البدء معًا في خلايا مصفوفة خلايا valCell.المتغير newVals سيكون مجموعة من الخلايا من الطول رقم (البداية الفريدة), حيث ستحتوي كل خلية على نتيجة الأداء nansum على الخلية المقابلة valCell.

حل للحلقة:

[Y,M] = datevec(allDts);
monthStart = datenum(Y,M,1);  % Start date of each month
[monthStart,sortIndex] = sort(monthStart);  % Sort the start dates
[uniqueStarts,uniqueIndex] = unique(monthStart);  % Get unique start dates

vals = vals(sortIndex,:);  % Sort the values according to start date
nMonths = numel(uniqueStarts);
uniqueIndex = [0 uniqueIndex];
newVals = nan(nMonths,size(vals,2));  % Preallocate
for iMonth = 1:nMonths,
  index = (uniqueIndex(iMonth)+1):uniqueIndex(iMonth+1);
  newVals(iMonth,:) = nansum(vals(index,:));
end

نصائح أخرى

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

ابحث عن الموحد في تبادل الملفات على Matlab Central

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