f



Nested parfor loop: Classification of Matrix inside loop

Hello,

I am having problems with the following loop, since it is taking too much time. Hence, I would like to use parallel processing, specifically parfor function.

Can anyone, please, help me to convert the following 'far' loop into 'parfor'?

P = numel(scaleX); %  quite BIG number
sz = P;
start = 1;
sqrL = 10; %  sqr len
e = 200;
A = false(sz, sz);

parfor m = sz-sqrL/2:(-1)*sqrL:start
    for n = M(m):-sqrL:1
        temp = [scaleX(m), scaleY(m); scaleX(n), scaleY(n)];
        d = pdist(temp, 'euclidean');
        if d < e
            A(m, n) = 1;
        end
    end
end

Thank you!
0
Bek
4/14/2015 1:14:42 AM
comp.soft-sys.matlab 211264 articles. 25 followers. lunamoonmoon (257) is leader. Post Follow

1 Replies
3851 Views

Similar Articles

[PageSpeed] 26

"Bek Abdik" <beknazar@unist.ac.kr> writes:

> I am having problems with the following loop, since it is taking too
> much time. Hence, I would like to use parallel processing,
> specifically parfor function.
>
> Can anyone, please, help me to convert the following 'far' loop into 'parfor'?
>
> P = numel(scaleX); %  quite BIG number
> sz = P;
> start = 1;
> sqrL = 10; %  sqr len
> e = 200;
> A = false(sz, sz);
>
> parfor m = sz-sqrL/2:(-1)*sqrL:start
>    for n = M(m):-sqrL:1
>        temp = [scaleX(m), scaleY(m); scaleX(n), scaleY(n)];
>        d = pdist(temp, 'euclidean');
>        if d < e
>            A(m, n) = 1;
>        end
>    end
> end

As the code analyzer message informs you, the range of a PARFOR loop
must be consecutive integers. There's more about the restriction here:

<http://www.mathworks.com/help/distcomp/parfor.html>

The other problem you have is that the form of indexing you're using
with 'A' still wouldn't work. This is because of the form of your inner
FOR loop, as described here:

<http://www.mathworks.com/help/distcomp/nesting-and-flow-in-parfor-loops.html#bq__cs7-9>

To work around that, I would normally create a temporary vector and then
assign a whole row of A, something like this:

....
mv = sz-sqrL/2:(-1)*sqrL:start;
parfor mi = 1:numel(mv)
    m = mv(mi);
    Arow = false(1, sz);
    for n = 100:-sqrL:1
        temp = [scaleX(m), scaleY(m); scaleX(n), scaleY(n)];
        d = pdist(temp, 'euclidean');
        if d < e
            Arow(n) = true;
        end
    end
    A(mi, :) = Arow;
end

Obviously, you need to map back from the 'A' that has been created since
your original loop is only accessing some of the rows of A.

Cheers,
Edric.
0
Edric
4/14/2015 7:40:45 AM
Reply: