2015-10-14 40 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