2016-05-01 2 views
0

Я пытаюсь построить некоторые данные. Сценарий, который я написал ниже, работал хорошо, но теперь я понятия не имею, почему он не работает.Как сделать векторы одинаковой длины в моем скрипте Matlab?

Вот код:

x = [335,41,14,18,15,9,7,9,20607,5,5,143,3,5,72,134,2,28,172,3,72,173,280,186,20924,1,1,22,3,3,1,2,13,1,3,2,11,66,12983,176,123,192,64,258,182,123,299,58,198,7,113,342,72,8376,122,20,19,2,3,28,8,36,8,56,43,2,48,127,395,4664,186,46,236,219,258,69,203,189,169,72,100,78,109,46,112,3929,272,40,4,31,2,97,36,5,35,56,2,237,1672,256,224,28,163,341,151,263,157,397,94,380,173,75,87,272,1194,133,6,112,1,6,2,26,25,64,8,40,57,106,525,150,248,125,269,264,256,357,153,64,152,283,1,2,2,454,154,39,1,1,64,151,242,1,18,99,1,36,607,55,54,110,225,108,37,1,144,162,137,107,21,360,362,18,51,25,43,1,3,6,1,27,7,45,326,32,103,50,124,155,39,180,143,33,116,46,7,151,120,19,4,2,4,110,2,7,4,9,4,27,216,323,148,1,1,2,1,47,113,150,1,2,144,16,4827,1,1,1,14]; 
size = length(x); 
disp(size); 
z = 0; 
for i = 1:size 
    z = z + 1; 
    y(i) = z; 
end 
scatter(x,y); 

Этот код должен гарантировать, что y имеет такой же длины, как x, как мы только заполнение y тех пор, пока х (так как мы используем для цикла от 1 до size, где size - это в основном число индексов в x), но я продолжаю получать эту ошибку. Я проверил с disp, и выяснилось, что мои векторы x и y имеют разную длину, x равно 227, а y - 256. Может ли кто-нибудь помочь мне с этой тривиальной проблемой?

ответ

2

Это, скорее всего, потому, что y был создан, чтобы быть другого размера, прежде чем вы запустите тот фрагмент кода, который вы нам показали. Где-то в вашем скрипте, прежде чем вы назовете этот фрагмент кода, y был создан как вектор с 256 элементами, и теперь вы повторно используете эту переменную в этой части кода, заполняя элементы в векторе y. Переменная x имеет 227 элементов, и цикл, который вы написали, изменит первые 227 элементов y, поскольку вы зацикливали столько раз, сколько есть элементов в x. Однако оставшиеся 29 элементов все еще существуют раньше. Повторное использование переменной y, вероятно, связано с тем, что ваш скрипт терпит неудачу, так как теперь размеры между обеими переменными не совпадают. Таким образом, явно воссоздать y перед тем, как позвонить scatter.

Фактически, что петля for не нужна вообще. Цель цикла - создать увеличивающийся массив от 1 до нескольких элементов, как у вас в x.

Просто сделайте это вместо:

y = 1:size; 

Я также не нравится, что вы создаете переменную size. Это затмевает функцию size, которая находит количество элементов в каждом измерении, которое содержит входной массив.

С рекомендациями я изложенным выше, замените весь код с этим:

x = [335,41,14,18,15,9,7,9,20607,5,5,143,3,5,72,134,2,28,172,3,72,173,280,186,20924,1,1,22,3,3,1,2,13,1,3,2,11,66,12983,176,123,192,64,258,182,123,299,58,198,7,113,342,72,8376,122,20,19,2,3,28,8,36,8,56,43,2,48,127,395,4664,186,46,236,219,258,69,203,189,169,72,100,78,109,46,112,3929,272,40,4,31,2,97,36,5,35,56,2,237,1672,256,224,28,163,341,151,263,157,397,94,380,173,75,87,272,1194,133,6,112,1,6,2,26,25,64,8,40,57,106,525,150,248,125,269,264,256,357,153,64,152,283,1,2,2,454,154,39,1,1,64,151,242,1,18,99,1,36,607,55,54,110,225,108,37,1,144,162,137,107,21,360,362,18,51,25,43,1,3,6,1,27,7,45,326,32,103,50,124,155,39,180,143,33,116,46,7,151,120,19,4,2,4,110,2,7,4,9,4,27,216,323,148,1,1,2,1,47,113,150,1,2,144,16,4827,1,1,1,14]; 
numX = numel(x); 
y = 1 : numX; 
scatter(x,y); 

Вектор y теперь создан явно вместо использования переменной, которая была создана с предыдущим размером в прошлом. Он также использует оператор двоеточия для явного создания этой последовательности вместо использования цикла for. То, что цикл for просто не нужен. numel определяет общее количество элементов входной матрицы. Мне не нравится использовать length в качестве личного предпочтения, потому что он находит количество элементов в самом большом измерении. Это может отлично работать для векторов, но на самом деле было трудно обнаружить ошибки в коде, который я написал в прошлом.

+0

Спасибо за помощь. Я привык к циклам на других языках программирования и, следовательно, должен был использовать цикл for. Спасибо – theprogrammer094

+0

@ rohitkrishna094 Изменено. Благодарю. BTW, если вы хотите избежать этой проблемы с вашим текущим кодом, вы можете явно ** очистить ** 'y' перед запуском своего кода. Либо сделайте 'clear y;' или 'y = [];' перед запуском этой части кода, и все будет хорошо .... но я все равно буду использовать оператор двоеточия для создания этой последовательности. – rayryeng

+0

О, хорошо. Будем держать это в виду, спасибо. – theprogrammer094

Смежные вопросы