2016-07-24 74 views
0

我有一个单元阵列grnPixels,其大小为(1 x 40),其中每个单元格都有一个M x 1向量数组,其中M是可变的。我也有一个大小为N x 1的称为redCentroid的单个矢量数组。如何检查数组中的值是否与单元格数组中的值对应

我想检查redCentroid中的值是否与grnPixels中的任何值相对应。我已经做了一个代码,但它是极其缓慢在这个Matlab代码。我该如何改进?所以没有必要外环或最内层循环

nRedCells = length(propsRed); 
nGrnCells = length(propsGrn); 
grnPixels = cell(1,nGrnCells); 
redCentroid = zeros(nRedCells,1); 
matchMemory = zeros(nRedCells,1); 

for j = 1:nRedCells 
    for i = 1:nGrnCells 
     for n = 1:length(grnPixels{i}) 
      matchment = ismember(redCentroid(j),grnPixels{i}(n)); 
      if matchment == 1 
       matchMemory(j,1:2) = [j i]; 
      end 
      continue 
     end 
    end 
end 

示例数据

redCentroid 

51756 
65031 
100996 
118055 
122055 
169853 
197175 
233860 
244415 
253822 

grnPixels{1} 

142 
143 
100996 
167 
168 

grnPixels{2} 

537 
538 
539 
540 
541 
542 
233860 
244415 
545 
546 
547 
548 

回答

1

ismember可以接受两者的第一或第二输入的矩阵。

matchMemory = zeros(numel(redCentroid), 2); 

for k = 1:numel(grnPixels) 
    % Check which of the centroids are in grnpixels 
    isPresent = ismember(redCentroid, grnPixels{k}); 

    % If they were present fill in the first column with the index in red 
    matchMemory(isPresent, 1) = find(isPresent); 

    % Fill in the second column with the index in green 
    matchMemory(isPresent, 2) = k; 
end 
+0

嗨,它似乎告诉我,'cat(2,grnPixels {:})'中'串联的矩阵的维度是不一致的。 – Senyokbalgul

+0

@Senyokbalgul刚做了一个小小的调整。 – Suever

+0

它似乎仍然给我同样的错误.. – Senyokbalgul

1

如果你想找到任何匹配,无论为了

  1. 复制两个矩阵的其他两个矩阵,如果你想在原来的矩阵保持不变。
  2. 排序两者的新矩阵的单独
  3. 比较两个矩阵的最低元件
  4. 如果它们匹配,该元件存储在一些收集器阵列
  5. 如果它们不这样做,移动到下一个数数字最小的一组。
  6. 重复第2步到第4步,直到你经历了一组。
  7. 收集器数组将包含所有匹配。

这应该以2 * M * log(M)+ 2 * M时间运行。

如果您想查找与匹配对应的原始矩阵中的索引,只需将收集器阵列中的每个元素与两个矩阵的元素进行比较,只要找到匹配就记录索引,并继续到达到结束。

如果元素按照特定顺序(如坐标),则只需将第一个元素中的元素1与第二个元素中的元素1进行比较即可。

相关问题