如何检查数组中的值是否对应于元胞数组中的值
How to check if the values in an array correspond to values in a cell array
我有一个名为 grnPixels
的单元格数组,大小为 (1 x 40)
,其中每个单独的单元格都有一个 M x 1
数字向量数组,其中 M
是可变的。我还有一个名为 redCentroid
的向量数组,大小为 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
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
如果您想查找任何匹配项而不考虑顺序
- 如果您希望原始矩阵保持不变,请将这两个矩阵复制到另外两个矩阵。
- 分别对两个新矩阵进行排序
- 比较两个矩阵的最低元素
- 如果它们匹配,则将元素存储在某个收集器数组中
- 如果他们不这样做,则移至组中数字最小的下一个数字。
- 重复第 2 步到第 4 步,直到完成一组。
- 收集器数组将包含所有匹配项。
这应该 运行 在 2*M*log(M)+2*M 时间。
如果你想在原始矩阵中找到匹配项对应的索引,只需将收集器数组中的每个元素与两个矩阵的元素进行比较,找到匹配项时记录索引,并继续直到你到达终点。
如果元素按特定顺序排列,例如坐标,只需将第一组中的元素 1 与第二组中的元素 1 进行比较。
我有一个名为 grnPixels
的单元格数组,大小为 (1 x 40)
,其中每个单独的单元格都有一个 M x 1
数字向量数组,其中 M
是可变的。我还有一个名为 redCentroid
的向量数组,大小为 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
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
如果您想查找任何匹配项而不考虑顺序
- 如果您希望原始矩阵保持不变,请将这两个矩阵复制到另外两个矩阵。
- 分别对两个新矩阵进行排序
- 比较两个矩阵的最低元素
- 如果它们匹配,则将元素存储在某个收集器数组中
- 如果他们不这样做,则移至组中数字最小的下一个数字。
- 重复第 2 步到第 4 步,直到完成一组。
- 收集器数组将包含所有匹配项。
这应该 运行 在 2*M*log(M)+2*M 时间。
如果你想在原始矩阵中找到匹配项对应的索引,只需将收集器数组中的每个元素与两个矩阵的元素进行比较,找到匹配项时记录索引,并继续直到你到达终点。
如果元素按特定顺序排列,例如坐标,只需将第一组中的元素 1 与第二组中的元素 1 进行比较。