2014-12-16 3 views
0

Ниже мой код:For Loop и индексирование

function marks(my_numbers) 
handle = zeros(5,1) 
x = 10 ; 
y = 10:20:100 ; 
for i = 1 
    for j = 1:5 ; 
     handle(j,i) = rectangle('position',[x(i),y(j),20 10],'facecolor','r') 
    end 
end 
end 

теперь позволяет говорить входной аргумент my_numbers = 2
так я написал код:

set(handle(j(my_numbers),1),'facecolor','g') 

С помощью этой команды, прямоугольник с более низким левый угол (30,10) должен стать зеленым. Но MATLAB дает ошибку индекса превышает размеры матрицы

+2

Ваш индекс i является своего рода бессмысленным - исправить его как 1. x = 10, так зачем вам нужно x (i)? Распечатайте точное сообщение об ошибке с консоли. Кроме того, цвета, вероятно, должны быть 20, 10, не 20 10. – ha9u63ar

ответ

1

Это скорее иллюстрированный комментарий, чем ответ, но поскольку @hagubear упомянул ваш индекс i, это бессмысленно, поэтому вы можете полностью удалить его.

Использование set(handle(my_numbers,1),'facecolor','g') удалит эту ошибку, поскольку вы пытаетесь получить доступ к handles(j(2),1), и это невозможно, потому что j - это скаляр.

Во всяком случае, используя эту линию после того, как ваш график работает отлично:

set(handle(my_numbers,1),'facecolor','g') 

Согласно вашему комментарию ниже, здесь это способ вызвать функцию несколько раз и добавить зеленые прямоугольники, как вы идете вперед. Есть 2 файла с целью демонстрации, функция сама по себе и скрипт для вызова функции несколько раз и генерировать анимированного GIF:

1) Функция:

function marks(my_numbers) 

%// Get green and red rectangles to access their properties. 
GreenRect = findobj('Type','rectangle','FaceColor','g'); 
RedRect = findobj('Type','rectangle'); 

%// If 1st call to the function, create your plot 
if isempty(RedRect) 

    handle = zeros(5,1); 

    x = 10 ; 
    y = 10:20:100 ; 

    for j = 1:5 ; 
     handle(j) = rectangle('position',[x,y(j),20 10],'facecolor','r'); 
    end 

    set(handle(my_numbers,1),'facecolor','g') 
%// If not 1st call, fetch existing green rectangles and color them green. Then color the appropriate rectangle given by my_numbers.  
else 
    RedRect = flipud(RedRect); %// Flip them to maintain correct order 
    if numel(GreenRect) > 0 
     hold on 
     for k = numel(GreenRect) 
      set(GreenRect(k),'facecolor','g') 
      set(RedRect(my_numbers,1),'facecolor','g') 
     end 
    end 

end 

2) Сценарий:

clear 
clc 

%// Shuffle order for appearance of green rectangles. 
iter = randperm(5); 

filename = 'MyGifFile.gif'; 
for k = iter 

    marks(k) 

    pause(1) 

    frame = getframe(1); 
    im = frame2im(frame); 
    [imind,cm] = rgb2ind(im,256); 
    if k == iter(1) 
     imwrite(imind,cm,filename,'gif', 'Loopcount',inf); 
    else 
     imwrite(imind,cm,filename,'gif','WriteMode','append'); 
    end 

end 

Вот анимированный GIF выхода:

+0

да, однако, я также хочу, чтобы при повторном вызове этой функции с входным аргументом my_numbers = 3 предыдущий должен оставаться зеленым, а не красным. – Manahil

+0

Хорошо, я отредактировал свой ответ. Думаю, это то, что вы хотите. Обязательно откройте анимированный gif! –

+0

Отличный я нашел, как показать анимированный gif! Это то, что вы хотели? –