0

我有一个称为grnPixelssize的单元格数组(1 x 40),其中每个单独的单元格都有一个M x 1数字向量数组,其中M是可变的。我还有一个名为redCentroidsize的向量数组N x 1

我想检查中的值是否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
4

2 回答 2

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
于 2016-07-24T13:03:18.880 回答
1

如果您想找到任何匹配项而不考虑顺序

  1. 如果您希望原始矩阵保持不变,请将这两个矩阵复制到另外两个矩阵。
  2. 分别对两个新矩阵进行排序
  3. 比较两个矩阵的最低元素
  4. 如果它们匹配,则将元素存储在某个收集器数组中
  5. 如果他们不这样做,请移至该组中编号最小的下一个数字。
  6. 重复步骤 2 到 4,直到完成一组。
  7. 收集器数组将包含所有匹配项。

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

如果您想在原始矩阵中找到与匹配项对应的索引,只需将收集器数组中的每个元素与两个矩阵的元素进行比较,找到匹配项时记录索引,然后继续直到结束。

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

于 2016-07-24T13:35:28.210 回答