如何对下面的循环进行矢量化?

时间:2014-02-15 16:46:23

标签: arrays matlab vectorization

任何人都可以帮助我对这个循环进行矢量化。 我有大型矩阵,我想要替换长度小于某个阈值的所有像素值。为简单起见,我们说

a = randi([1 5],10,10);
for i = 1:length(a)
    someMat=a(a==i);
    if length(someMat)<20
        a(a==i)=0;
    end
end

但它杀了我。

示例:

  a = randi([1 5],10,10)
    a =
         5     2     1     5     5     5     2     2     3     2
         3     3     5     4     4     4     3     1     1     5
         5     1     3     5     3     3     4     1     3     1
         3     1     5     3     2     5     1     1     5     1
         1     1     4     3     4     3     4     4     5     1
         1     4     3     5     1     1     2     2     2     1
         3     3     5     2     4     1     1     3     2     4
         4     1     5     3     4     5     3     4     3     3
         5     3     5     5     4     3     1     3     4     1
         4     1     1     3     5     5     1     3     3     5

Thresold 20的结果

        5     0     1     5     5     5     0     0     3     0
        3     3     5     0     0     0     3     1     1     5
        5     1     3     5     3     3     0     1     3     1
        3     1     5     3     0     5     1     1     5     1
        1     1     0     3     0     3     0     0     5     1
        1     0     3     5     1     1     0     0     0     1
        3     3     5     0     0     1     1     3     0     0
        0     1     5     3     0     5     3     0     3     3
        5     3     5     5     0     3     1     3     0     1
        0     1     1     3     5     5     1     3     3     5

像素4的长度为17 像素2的长度为10

我通过像

之类的东西来尝试
[nVal Index] = histc(a(:),unique(a)); %
nVal(nVal>20) = 1; % just some threshold value and assigning by some Number may be zero as well

但我不知道如何替换相应Pixal的Index Values并应用reshape以原始形式获取它。在这里即使我不确定我会得到相同的Matrix With Reshape。请帮我..... 感谢

2 个答案:

答案 0 :(得分:1)

我认为这可以满足您的需求:

threshold_length = 20;
replace_value = 0;

u = unique(a); %// values of a
h = histc(a(:), u); %// count for each value
r = u(h<threshold_length); %// values to be removed
a(ismember(a,r)) = replace_value; %// remove those values

答案 1 :(得分:0)

我看到@LuisMendo比我更快地得到了相同的解决方案,但使用ismember的另一种方法是使用unique给你的更多内容:

threshold = 20;
[vals, ~, ix] = unique(a);   % capture the values and their indices
counts = histc(a(:), vals);  % count the occurrences of each value
vals(counts<threshold) = 0;  % zero the values that aren't common enough
a(:) = vals(ix);             % recreate the matrix with updated values