# The variable s in a parfor cannot be classified.

1 view (last 30 days)
Janki Mehta on 30 Jan 2015
Edited: Matt J on 5 Feb 2015
I would like to run the following code snippet in parallel as the size of the data is too huge.
data_no = 10099;
alpha = 0.5;
m = 1;
parfor i=1:data_no
parfor j=i+1:data_no
s1 = norm(data_corr(i,:)-data_corr(j,:));
s2 = norm(data(i,:)-data(j,:));
d = s1 + alpha*s2;
s(m,1) = i;
s(m,2) = j;
s(m,3) = -d;
m = m+1;
end
end
But I get the error "The variable s in a parfor cannot be classified". I have not had much luck with understanding the matlab help unfortunately.
Thanks,
Janki

Matt J on 30 Jan 2015
Here is a method that avoids looping altogether. I expect it would be much faster than a parfor approach.
data_no=size(data_corr,1);
[I,J]=ndgrid(1:data_no);
idx=(J>I);
D=normMatrix(data_corr)+alpha*normMatrix(data);
s=[I(idx), J(idx), -D(idx)].';
function S=normMatrix(data)
normterms=sum(data.^2,2);
crossterms=data*data.';
S=bsxfun(@minus,normterms, 2*crossterms);
S=bsxfun(@plus,S,normterms.');
S=sqrt(S);
end
##### 2 CommentsShowHide 1 older comment
Matt J on 5 Feb 2015
With data_no=60000, the 's' you are trying to compute would be 40GB in double floats or half that in single floats. You could get that much RAM if you were really determined, I suppose, but you should probably be rethinking your goals instead...

Matt J on 30 Jan 2015
Edited: Matt J on 30 Jan 2015
[I,J]=ndgrid(1:data_no);
idx=(J>I);
I=I(idx); J=J(idx);
N=length(J);
s=nan(3,N);
parfor m=1:N
i=I(m);
j=J(m);
s1 = norm(data_corr(i,:)-data_corr(j,:));
s2 = norm(data(i,:)-data(j,:));
d = s1 + alpha*s2;
s(:,m)=[i;j;-d];
end
s=s.';