如何在MATLAB中对矩阵的列进行范围查找向量化处理?

3

我有一个图像掩码,想找到每列中图像的宽度。是否有一种向量化的方法来加快速度? 我尝试过使用arrayfun来解决问题,但目前还没有得到有效的结果。

r = zeros(1,cols);
for i = 1 : cols
    r(i) = range(find(img(:,i)));
end
3个回答

2
以下代码以向量化的方式执行与您代码相同的操作:
imglog = img~=0; %// convert to 0 and 1 values
[~, i1] = max(imglog); %// i1 is the position of the first 1
[~, i2] = max(flipud(imglog)); %// size(img,1)+1-i2 is the position of the last 1
r = size(img,1)+1-i2 - i1;

它利用了 max 的第二个输出结果,该输出结果给出每列的第一个最大值的位置。

不错!确实比我的版本快! :) [cputime 评估显示你的版本比我的快8倍!] - matheburg
@matheburg 谢谢!cellfun很方便,但通常比较慢。 - Luis Mendo

1

我不确定这是否更快,但是 num2cell + cellfun 似乎是向列向量化通用函数的唯一方法:

r = cellfun(@(x)range(find(x)),num2cell(img,1));

1

find + unique方法 -

[row1,col1]  = find(img);
[~,start1] = unique(col1,'first');
[~,stop1] = unique(col1);
r = row1(stop1) - row1(start1);

我别无选择,只能用这个!你偷了 max :) 那一定更快!因为这个,你已经得到了我的 +1! - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接