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

조회 수: 7(최근 30일)
Teshan Rezel
Teshan Rezel 2021년 3월 22일
답변: Rik 2021년 3월 23일
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
Teshan Rezel
Teshan Rezel 2021년 3월 23일
Hi @Jan, thank you, I shall do this now!

댓글을 달려면 로그인하십시오.

채택된 답변

Rik
Rik 2021년 3월 23일
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

추가 답변(1개)

Steven Lord
Steven Lord 2021년 3월 22일
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
Teshan Rezel
Teshan Rezel 2021년 3월 23일
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?

댓글을 달려면 로그인하십시오.

Community Treasure Hunt

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

Start Hunting!

Translated by