Can I just run some (loopless) code n times without having to modify the code to include a for loop?

1 回表示 (過去 30 日間)
Steve
Steve 2019 年 10 月 24 日
コメント済み: Steve 2019 年 10 月 25 日
I would like to know if it is possible to run the attached code n times, without having to modify the code (i.e., to include a for loop); yet, every time the code is run, I need the input value (pt) to increment from 1 to n. I also need to store the output variables of the code within in a single variable that contains the output from all n iterations (please see attached code):
close all;
clearvars;
load('F_points.mat');
load('fpep.mat');
xy = F_points';
pt = 299; % choose a point in xy and we'll find the n nearest neighbors.
% Euclidean distance between xy(p,:) and all other points
dist = sqrt((xy(:,1)-xy(pt,1)).^2 + (xy(:,2)-xy(pt,2)).^2);
n = 3; % Find the n closest values (excluding the point selected)
[~, ascendIdx] = sort(dist);
ascendIdx(ascendIdx==pt) = []; %remove the pt point
xyNearest = xy(ascendIdx(1:n),:);
% dist_a = sqrt((fpep(pt,1)-fpep(pt,7)).^2 + (fpep(pt,2)-fpep(pt,8)).^2);
% dist_b = sqrt((fpep(pt,3)-fpep(pt,7)).^2 + (fpep(pt,4)-fpep(pt,8)).^2);
% dist_c = sqrt((fpep(pt,5)-fpep(pt,7)).^2 + (fpep(pt,6)-fpep(pt,8)).^2);
adirector_x = ([fpep(pt,1) - fpep(pt,7)]);
adirector_y = ([fpep(pt,2) - fpep(pt,8)]);
bdirector_x = ([fpep(pt,3) - fpep(pt,7)]);
bdirector_y = ([fpep(pt,4) - fpep(pt,8)]);
cdirector_x = ([fpep(pt,5) - fpep(pt,7)]);
cdirector_y = ([fpep(pt,6) - fpep(pt,8)]);
vector_a = [adirector_x adirector_y];
vector_b = [bdirector_x bdirector_y];
vector_c = [cdirector_x cdirector_y];
chordx = ([xyNearest(:,1) - xy(pt,1)]);
chordy = ([xyNearest(:,2) - xy(pt,2)]);
chordxy = [chordx chordy];
% chord_dist = sqrt((chordx).^2 + (chordy).^2);
% adirector_dist = sqrt((adirector_x).^2 + (adirector_y).^2);
% bdirector_dist = sqrt((bdirector_x).^2 + (bdirector_y).^2);
% cdirector_dist = sqrt((cdirector_x).^2 + (cdirector_y).^2);
for j = 1 : n
CosTheta_a(j) = dot(vector_a,chordxy(j,:))/(norm(vector_a)*norm(chordxy(j,:)));
CosTheta_b(j) = dot(vector_b,chordxy(j,:))/(norm(vector_b)*norm(chordxy(j,:)));
CosTheta_c(j) = dot(vector_c,chordxy(j,:))/(norm(vector_c)*norm(chordxy(j,:)));
end
ThetaInDegrees_a = acosd(CosTheta_a);
ThetaInDegrees_b = acosd(CosTheta_b);
ThetaInDegrees_c = acosd(CosTheta_c);
% Plot
figure()
for ii = 1 : length(chordx)
xvals = [xy(pt,2),xy(pt,2)+chordy(ii)];
yvals = [xy(pt,1),xy(pt,1)+chordx(ii)];
plot(xvals,yvals,'r-')
hold on
end
plot(xy(:,2),xy(:,1),'b.')
hold on
% Show the selected point
plot(xy(pt,2),xy(pt,1),'b.','MarkerFaceColor', 'y')
% Show nearest 'n' dots
plot(xyNearest(:,2),xyNearest(:,1),'ro')
plot(fpep(:,2),fpep(:,1),'k.')
plot(fpep(:,4),fpep(:,3),'k.')
plot(fpep(:,6),fpep(:,5),'k.')
axis equal
Thanks in advance for your help!
  3 件のコメント
Daniel M
Daniel M 2019 年 10 月 24 日
You're literally describing a loop. Don't try to take shortcuts when you know what the proper solution is. Turn your script into a function, and call it in a loop.
Steve
Steve 2019 年 10 月 25 日
Thanks to everyone for your feedback!
I can run my code (as shown above) with a specific input value for pt, and get exactly the output that I need for that particular pt. However, because I have 953 different points (values for pt), it would not be much fun to manually increment the pt (from 1 to 953) and run the code for each case. I did attempt (for many hours, but to no avail) to incorporate for loops within my code but the syntax became very busy, very fast--and I simply could not get it to work (see attached code below). Can anyone show me how this should be done?
Also, I read through the help section on converting a script into a function, but it's not clear to me how to actually do this with my script (above). Also, I'm not sure how to pass an input (pt) and how to pass the incremented outputs (ThetaInDegrees_a, ThetaInDegrees_b, and ThetaInDegrees_c) to the function, once it is defined. Can someone show me how to do this? Again, thanks for all your help!
close all;
clearvars;
load('F_points.mat');
load('fpep.mat');
xy = F_points';
for pt = 1 : 953 % iterate the point in xy and we'll find the 10 nearest neighbors.
% Euclidean distance between xy(p,:) and all other points
dist = sqrt((xy(:,1)-xy(pt,1)).^2 + (xy(:,2)-xy(pt,2)).^2);
% Find the n closest values (excluding the point selected)
n = 3;
[~, ascendIdx] = sort(dist);
ascendIdx(ascendIdx==pt) = []; %remove the pt point
xyNearest = xy(ascendIdx(1:n),:);
% dist_a = sqrt((fpep(pt,1)-fpep(pt,7)).^2 + (fpep(pt,2)-fpep(pt,8)).^2);
% dist_b = sqrt((fpep(pt,3)-fpep(pt,7)).^2 + (fpep(pt,4)-fpep(pt,8)).^2);
% dist_c = sqrt((fpep(pt,5)-fpep(pt,7)).^2 + (fpep(pt,6)-fpep(pt,8)).^2);
adirectorx(pt) = ([fpep(pt,1) - fpep(pt,7)]);
adirector_x = adirectorx';
adirectory(pt) = ([fpep(pt,2) - fpep(pt,8)]);
adirector_y = adirectory';
bdirectorx(pt) = ([fpep(pt,3) - fpep(pt,7)]);
bdirector_x = bdirectorx';
bdirectory(pt) = ([fpep(pt,4) - fpep(pt,8)]);
bdirector_y = bdirectory';
cdirectorx(pt) = ([fpep(pt,5) - fpep(pt,7)]);
cdirector_x = cdirectorx';
cdirectory(pt) = ([fpep(pt,6) - fpep(pt,8)]);
cdirector_y = cdirectory';
vector_a = [adirector_x adirector_y];
vector_b = [bdirector_x bdirector_y];
vector_c = [cdirector_x cdirector_y];
chordx(pt,:) = ([xyNearest(:,1) - xy(pt,1)]);
chordy(pt,:) = ([xyNearest(:,2) - xy(pt,2)]);
% chord_dist = sqrt((chordx).^2 + (chordy).^2);
chordxy = [chordx chordy];
% for t = 1 : n
CosTheta_a(pt) = dot(vector_c(pt:pt,1:2),chordxy(pt:pt,1:2))/(norm(vector_c(pt:pt,1:2))*norm(chordxy(pt:pt,1:2)));
CosTheta_b(pt) = dot(vector_c(pt:pt,1:2),chordxy(pt:pt,3:4))/(norm(vector_c(pt:pt,1:2))*norm(chordxy(pt:pt,4:5)));
CosTheta_c(pt) = dot(vector_c(pt:pt,1:2),chordxy(pt:pt,5:6))/(norm(vector_c(pt:pt,1:2))*norm(chordxy(pt:pt,5:6)));
% end
end
% adirector_dist = sqrt((adirector_x).^2 + (adirector_y).^2);
% bdirector_dist = sqrt((bdirector_x).^2 + (bdirector_y).^2);
% cdirector_dist = sqrt((cdirector_x).^2 + (cdirector_y).^2);
% for t = 1 : n
% CosTheta_a(t) = dot(vector_a(1,:),chordxy(t:t,1:2))/(norm(vector_a(1,:))*norm(chordxy(t:t,1:2)));
% CosTheta_b(t) = dot(vector_b(1,:),chordxy(t:t,3:4))/(norm(vector_b(1,2))*norm(chordxy(t:t,4:5)));
% CosTheta_c(t) = dot(vector_c(1,:),chordxy(t:t,5:6))/(norm(vector_c(1,2))*norm(chordxy(t:t,5:6)));
% end
ThetaInDegrees_a = acosd(CosTheta_a);
ThetaInDegrees_b = acosd(CosTheta_b);
ThetaInDegrees_c = acosd(CosTheta_c);
% Plot
figure()
for ii = 1 : length(chordx)
xvals = [xy(pt,2),xy(pt,2)+chordy(ii)];
yvals = [xy(pt,1),xy(pt,1)+chordx(ii)];
plot(xvals,yvals,'r-')
hold on
end
plot(xy(:,2),xy(:,1),'b.')
hold on
% Show the selected point
plot(xy(pt,2),xy(pt,1),'b.','MarkerFaceColor', 'y')
% Show nearest 'n' dots
plot(xyNearest(:,2),xyNearest(:,1),'ro')
plot(fpep(:,2),fpep(:,1),'k.')
plot(fpep(:,4),fpep(:,3),'k.')
plot(fpep(:,6),fpep(:,5),'k.')
axis equal

サインインしてコメントする。

回答 (1 件)

Steven Lord
Steven Lord 2019 年 10 月 24 日
Technically yes, but practically you're probably going to want to just add the loop or convert your code into a function and call that function in a loop as Daniel M suggested.

カテゴリ

Help Center および File ExchangeQuadratic Programming and Cone Programming についてさらに検索

製品


リリース

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by