2015-10-14 5 views
1

У меня есть несколько матриц, которые мне нужно добавить в одну большую матрицу. Большая матрица (300002x50) разделяется на 0,001 секунд, а время для других 49 матриц (14250x2) примерно равно 0,02, но не равномерно распределено. Я попробовал find, чтобы индексировать записи из меньших матриц в большую матрицу, но это было слишком медленно. С тех пор я пробовал:Как внедрить логическое индексирование быстрее в Matlab?

 for a = 1:length(test) 
      aaa = abs(AF1(:,1)-test(a,1))<10^-6; 
      AF1(aaa,index)=test(a,2); 
     end 

Где test является 14250x2 двойной (time,data), AF1 является 300002x50 двойной матрицей и index является какой столбец в AF1 данные будут добавлены. Это было немного быстрее, но оно по-прежнему занимает 99,3% (29 минут) того времени. Он работает так, как я хочу, но есть ли способ реализовать это быстрее?

+0

Как вы получили 50 матриц? Возможно, в этом есть что улучшить. – Adriaan

+0

И что такое индекс? Это второй цикл по всем столбцам? Или вы выбираете сразу несколько строк? –

+0

У меня есть 49 наборов данных, и все они имеют свое собственное время (большинство разделено на .02), но некоторые из них разделены на .019 и .021, поэтому его неравномерно. Тайминги не совпадают между наборами. – mtourtelot

ответ

0

разрешений памяти и запрет на разовый случай, когда index ~= 1, вы можете использовать векторизованный подход с семейством полезных функций, которые включают bsxfun и accumarray, хорошо поддерживается find и abs под умелым руководством linear indexing -

[R,C] = find(abs(bsxfun(@minus,AF1(:,1),test(:,1).')) < 10^-6) %//' 
idx = accumarray(R,C,[],@max) 

AF1((index-1)*size(AF1,1) + find(idx)) = test(idx(idx~=0),2); 

память не позволяет, будет совершение преступления с использованием цикла, который будет модифицированная версией существующего цикла, например, так -

valid_mask = true(size(AF1,1),1); 
for a = size(test,1):-1:1 
    aaa = (abs(AF1(:,1)-test(a,1))<comp_val) & valid_mask; 
    valid_mask(aaa) = 0; 
    AF1(aaa,index)=test(a,2); 
end 
+0

Я не мог использовать bsxfun таким образом из-за недостаточной памяти – mtourtelot

+0

@mtourtelot Yup! Я боялся, что вы столкнетесь с этой ситуацией :) – Divakar

+0

@mtourtelot Ознакомьтесь с дополнительными кодами. – Divakar

 Смежные вопросы

  • Нет связанных вопросов^_^