在for循环matlab中计算速度

时间:2014-06-07 16:55:11

标签: matlab image-processing matrix

我在矩阵中计算时出现问题。这个问题与计算速度有关。

我有一个二进制图像矩阵(f),我在matlab中找到了bwlabel的连通分量。 [L num] = bwlabel(f);

在基于某些属性后,我发现了一个向量p,它包含了我需要删除的一些L值。这是我的代码和解释

function [f,L] = clear_nontext(f,L,nontext)
% p is a vector include a lot of value we need to remove
p=find(nontext(:)~=0);
% example p= [1 2 9 10 100...] that mean we need to find in L matrix where get the value =1,2,9,10,100..] and remove it   
[a b]=size(L);
g=zeros(a,b);
for u=1:length(p)
    for i=1:a
        for j=1:b
        if L(i,j)==p(u)
            g(i,j)=1;
            %L(i,j)=500000;
            f(i,j)=0;
        end
        end
    end
end
end

当我使用这种方式时,程序运行但速度很慢,因为有一个p值我们需要再次检查矩阵f(或L)中的所有值。所以我需要另一种方法来更快地运行它。你能帮帮我吗?

非常感谢

1 个答案:

答案 0 :(得分:3)

通常,MATLAB执行矩阵运算(或索引运算)然后循环 您可以尝试以下方法:

g(ismember(L,p)) = 1;
f(ismember(L,p)) = 1;

编辑:
我很好奇所以我做了一点测试:

L = round(20*randn(10000,10000));
f = L;
p = 1:5;

[a b]=size(L);
g=zeros(a,b);

tic;
for u=1:length(p)
    for i=1:a
        for j=1:b
            if L(i,j)==p(u)
                g(i,j)=1;
                f(i,j)=0;
            end
        end
    end
end
toc

我得到了:

Elapsed time is 38.960842 seconds.

当我尝试以下操作时:

tic;
g(ismember(L,p)) = 1;
f(ismember(L,p)) = 0;
toc

我得到了

Elapsed time is 5.735137 seconds.