Is there a way to call a part of a function using an index?

12 views (last 30 days)
I have a function that I call several times:
plot(position6(1),position6(2),'r+', 'MarkerSize', 100, 'Color', 'w');
h = images.roi.Circle(gca,'Center', position6,'Radius',100, 'Color', 'w', 'FaceAlpha', 0);
Where "position6" is one of N positions defined. Currently, I am manually defining each of them and writing these two lines of code for each position vector (which is in a matrix of vectors). Is there any way to condense this to make it neater, such that I can refer to each instance of the code using the index of the vector matrix? Perhaps with a function?
For example:
myfunc(6)
returns:
plot(position6(1),position6(2),'r+', 'MarkerSize', 100, 'Color', 'w');
h = images.roi.Circle(gca,'Center', position6,'Radius',100, 'Color', 'w', 'FaceAlpha', 0);
Thanks. Here's the full verson of the relevant code segment.
[rows, columns, numberOfColorChannels] = size(img);
figure;
imshow(img);
position1 = [(columns*0.75), (rows*0.5)];
position8 = [(columns*0.75), (rows*0.25)];
position9 = [(columns*0.75), (rows*0.75)];
position2 = [(columns*0.25), (rows*0.5)];
position6 = [(columns*0.25), (rows*0.25)];
position7 = [(columns*0.25), (rows*0.75)];
position3 = [(columns*0.5), (rows*0.5)];
position4 = [(columns*0.5), (rows*0.25)];
position5 = [(columns*0.5), (rows*0.75)];
position = {position1, position2, position3, position4, position5, position6, position7, position8, position9};
hold on;
plot(position{6}(1),position{6}(2),'r+', 'MarkerSize', 100, 'Color', 'w');
h = images.roi.Circle(gca,'Center', position{6},'Radius',100, 'Color', 'w', 'FaceAlpha', 0);
  4 Comments
Jan
Jan on 23 Mar 2021
@Teshan Rezel: We usually do not delete questions, if they got an answer already. Simply insert a link to the new question by editing the text of your question and mark it by: "[EDITED, better version of the question: ... ] "

Sign in to comment.

Accepted Answer

Rik
Rik on 23 Mar 2021
Reposting as answer:
For the reasons set out in the answer by Steven (and the subsequent comments), numbering your variables in not ideal. If you use arrays, you can index them:
columns = 80;
rows = 24;
[c,r]=ndgrid([0.75 0.25 0.5],[0.5 0.25 0.75]);
position=[columns*c(:) rows*r(:)];
position=mat2cell(position,ones(1,size(position,1)),2);
disp(position.')
{[60 12]} {[20 12]} {[40 12]} {[60 6]} {[20 6]} {[40 6]} {[60 18]} {[20 18]} {[40 18]}
myfun(position{6})
function h=myfunc(pos)
plot(pos(1),pos(2),'r+', 'MarkerSize', 100, 'Color', 'w');
h = images.roi.Circle(gca,'Center', pos,'Radius',100, 'Color', 'w', 'FaceAlpha', 0);
if nargout==0,clear,end
end

More Answers (1)

Steven Lord
Steven Lord on 22 Mar 2021
Do you mean you want to plot position6(1) versus position6(2) in the first call, position6(3) versus position6(4) in the second, etc.? That's easy, a simple for loop (incrementing by two) would be easiest.
for k = 1:2:10
fprintf("Processing elements %d and %d.\n", k, k+1)
end
Processing elements 1 and 2. Processing elements 3 and 4. Processing elements 5 and 6. Processing elements 7 and 8. Processing elements 9 and 10.
Or do you want to plot position6(1) versus position6(2) in the first call, position7(1) versus position7(2) in the second, position8(1) versus position8(2) in the third, etc.?
If the latter, that approach is strongly discouraged.
  13 Comments
Rik
Rik on 23 Mar 2021
This sounds as simple as:
myfun(position{6})
function h=myfunc(pos)
plot(pos(1),pos(2),'r+', 'MarkerSize', 100, 'Color', 'w');
h = images.roi.Circle(gca,'Center', pos,'Radius',100, 'Color', 'w', 'FaceAlpha', 0);
if nargout==0,clear,end
end
Or am I misunderstanding what it is you want?
Teshan Rezel
Teshan Rezel on 23 Mar 2021
hi @Rik, thanks, this works! I needed to call the function before the definition...Please could you repost as an answer and I'll confirm it as the answer to the question?

Sign in to comment.

Categories

Find more on Shifting and Sorting Matrices in Help Center and File Exchange

Products


Release

R2020b

Community Treasure Hunt

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

Start Hunting!