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

 采纳的回答

Matt Fig
Matt Fig 2011-3-29

1 个投票

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 个评论

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?
chi2(i,j) = (y-y_pred).^2;
Matt Fig
Matt Fig 2011-3-29
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.
To nit-pick: the built-in values for i and j are variables, not functions.
Matt Fig
Matt Fig 2011-3-29
But, they are functions too!
which i
which j
Also, see the help...
Matt Fig
Matt Fig 2011-3-29
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.
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 2011-3-29
I didn't know about the FUNCTIONS function, thanks Walter. That could come in handy!
Matt Fig
Matt Fig 2011-3-29
BTW, what does the second field, 'type' mean here? I see REPMAT is simple, so is PLOT!
I found it by using methods(@i)
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.

请先登录,再进行评论。

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Performance and Memory 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by