Hello,
Here is my code:-
clear all
x = 1:3;
y = 1:3;
a = 1:3;
b = 1:3;
for i = 1:3;
for j = 1:3;
a_pred = a(:,i);
b_pred = b(:,j);
y_pred = a_pred + b_pred.* x;
chi2 = (y-y_pred).^2;
end
end
how would I amend the nested loop so that every single combination of a and b values are calculated in y_pred please? i.e. a(1) and b(1) then a(2) and b(1) all the way to a(3) and b(3).
Thanks

 Réponse acceptée

Matt Fig
Matt Fig le 29 Mar 2011

1 vote

Why do you think all aren't being calculated? Here is a modified version of your code, not changing the mechanics, which shows what you are getting.
a = 1:3;
b = 1:3;
for i = 1:3;
for j = 1:3;
a_pred = a(:,i);
b_pred = b(:,j);
disp([a_pred b_pred])
end
end
.
.
EDIT
.
Here is how to store all the results in chi2:
x = 1:3;
y = 1:3;
a = 1:3;
b = 1:3;
chi2 = zeros(9,3);
cnt = 0;
for i = 1:3;
for j = 1:3;
cnt = cnt + 1;
a_pred = a(:,i);
b_pred = b(:,j);
y_pred = a_pred + b_pred.* x
chi2(cnt,:) = (y-y_pred).^2;
end
end
chi2
And here is a vectorized version, using NPERMUTEK:
IDX = npermutek(1:3,2);
y_pred = bsxfun(@plus,a(IDX(:,1)), bsxfun(@times,b(IDX(:,2)),x.'));
chi2 = bsxfun(@minus,y,y_pred.').^2
Not that it should be faster here...

11 commentaires

Dominic Lawson
Dominic Lawson le 29 Mar 2011
Dear Matt,
Thanks for getting back to me so quickly. Is it the case they are being calculated but are being over written and not stored in a matrix? The [] help store the numbers in a matrix?
Walter Roberson
Walter Roberson le 29 Mar 2011
chi2(i,j) = (y-y_pred).^2;
Matt Fig
Matt Fig le 29 Mar 2011
As Walter shows, you are overwriting chi2 every loop iteration. For best results, pre-allocate your chi2 matrix before the loops.
chi2 = zeros(3);
for ...
for ..
...
...
chi2(i,j) = ...
end
end
Also, I recommend you get in the practice of _not_ using i and j as loop indices as they will mask the built-in MATLAB functions i and j.
Walter Roberson
Walter Roberson le 29 Mar 2011
To nit-pick: the built-in values for i and j are variables, not functions.
Matt Fig
Matt Fig le 29 Mar 2011
But, they are functions too!
which i
which j
Also, see the help...
Matt Fig
Matt Fig le 29 Mar 2011
Actually, since (y-y_pred).^2 is a row vector, storing in chi2(i,j) will not work. You will have to use a cell array and/or do some fancy indexing to save all these rows. See my edit above.
Walter Roberson
Walter Roberson le 29 Mar 2011
You are right, Matt. I got confused because class(i) returns 'double'. But of course with them being functions, naming them is equivalent to invoking them with no arguments, so that is what is done when I ask for the class.
Another way to see that it is built in is,
functions(@i)
the "file" field of which reads 'MATLAB built-in function' which would not be the case if i was a plain variable.
Matt Fig
Matt Fig le 29 Mar 2011
I didn't know about the FUNCTIONS function, thanks Walter. That could come in handy!
Matt Fig
Matt Fig le 29 Mar 2011
BTW, what does the second field, 'type' mean here? I see REPMAT is simple, so is PLOT!
Walter Roberson
Walter Roberson le 29 Mar 2011
I found it by using methods(@i)
Walter Roberson
Walter Roberson le 29 Mar 2011
Good question about 'type'. I was not able to find anything that did not indicate 'simple' there. I did find, though, that functions will use an empty file name for methods that do not have a file of their own. For example, functions(@func2str) where which shows func2str as if it is part of a file that does not actually exist.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Performance and Memory dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by