2015-10-14 73 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個數據集,他們都有自己的時間(大多數分割0.02),但有些分裂0.019和0.021,所以它不統一。時機不匹配集之間。 – mtourtelot

回答

0

內存允許和禁止的一次性情況下,當index ~= 1,您可以使用矢量化的方法與家庭的,其中包括bsxfunaccumarray有用的功能,深受findabs支持的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是!我擔心你可能會遇到這種情況:) – Divakar

+0

@mtourtelot請查看添加的代碼。 – Divakar