I have two variables i,j, where j index start depends on i index.
n = 3;
for i = 1:n
for j = i+1:n
% Feature matching
matches = getMatches(input, allDescriptors{i}, allDescriptors{j});
nf = size(matches, 2);
numMatches(i,j) = nf;
end
end
I am trying to linearize it using the below code:
n = 3;
M = n;
N = n;
parfor i = 1:M*N
% IND2SUB converts from a "linear" index into individual
% subscripts
[ii,jj] = ind2sub([M,N], i);
if (ii~=jj)
matches = getMatches(input, allDescriptors{ii}, allDescriptors{jj});
nf = size(matches, 2);
numMatches(i) = nf;
end
end
But have some entries on the lower part of the square matrix.
Any help is appreciated!

 Akzeptierte Antwort

Jeff Miller
Jeff Miller am 18 Jul. 2021

0 Stimmen

One approach is to set out all the desired pairs in advance. A crude way to do that is
pairs = zeros(0,2);
n = 3;
for i = 1:n % or reallyl just to n-1?
for j = i+1:n
pairs(end+1,:) = [i, j];
end
end
Then your parfor loop can just go through the preset pairs:
npairs = size(pairs,1);
parfor i = 1:npairs
ii = pairs(i,1);
jj = pairs(i,2);
matches = getMatches(input, allDescriptors{ii}, allDescriptors{jj});
nf = size(matches, 2);
numMatches(i) = nf;
end

5 Kommentare

It should fill-in the upper triangular matirx (except i,j = 1,1), but the first column in
numMatches
is getting filled up.
Maybe change
numMatches(i) = nf;
to
numMatches(ii,jj) = nf;
I don't see your definition of numMatches so I'm not sure what you want
Preetham Manjunatha
Preetham Manjunatha am 18 Jul. 2021
Bearbeitet: Preetham Manjunatha am 18 Jul. 2021
If it is
numMatches(ii,jj) = nf;
MATLAB thows an error:
Unable to classify the variable 'numMatches' in the body of the parfor-loop.
OK, then I guess you have to store the parfor results in a temporary vector and put them into numMatches after the parfor loop is done.
pairs = zeros(0,2);
n = 3;
for i = 1:n % or reallyl just to n-1?
for j = i+1:n
pairs(end+1,:) = [i, j];
end
end
npairs = size(pairs,1);
temp = zeros(npairs,1);
parfor i = 1:npairs
ii = pairs(i,1);
jj = pairs(i,2);
matches = getMatches(input, allDescriptors{ii}, allDescriptors{jj});
nf = size(matches, 2);
temp(i) = nf;
end
numMatches = zeros(n,n);
for i=1:npairs
ii = pairs(i,1);
jj = pairs(i,2);
numMatches(ii,jj) = temp(i);
end
Thanks, it works! But there are way too many for loops, which I was trying to avoid.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Hilfe-Center und File Exchange

Produkte

Version

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by