Общая матричная индексация Matlab для доступа к нескольким строкам

Изменить для ясности:

У меня две матрицы, п.валор 2х1000 и п.клас 1х1000. p.valor состоит из случайных чисел от -6 до 6. p.clase содержит по порядку 200 1:s, 200 2:s и 600 3:s. Чего я не хочу делать, так это

Напечатайте p.valor, используя разные цвета/подсказки для каждого класса, определенного в p.clase, как показано на следующем рисунке.

Я сначала написал это, чтобы узнать, какие места в p.valor представлены, где 1,2 соответствуют 3, где в p.clase

 %identify the locations of all 1,2 respective 3 in p.clase
    f1=find(p.clase==1);
    f2=find(p.clase==2);
    f3=find(p.clase==3);

%define vectors in p.valor representing the locations of 1,2,3 in p.clase     
     x1=p.valor(f1);
     x2=p.valor(f2);
     x3=p.valor(f3);

В p.valor 200 единиц (1), таким образом, x1=(1:200). Проблема в том, что каждое число один(1) (и, соответственно, 2 и 3) представляет ДВА элемента в p.valor, так как p.valor имеет 2 строки. Таким образом, несмотря на то, что p.clase и, следовательно, x1 теперь имеют только одну строку, мне нужно включить элементы в те же столбцы, что и все местоположения в f1.

Таким образом, различные альтернативы, которые я пробовал, еще не увенчались успехом. Примеры:

plot(x1(:,1), x1(:,2),'ro')
hold on
plot(x2(:,1),x2(:,2),'k.')
hold on
plot(x3(:,1),x3(:,2),'b+')

и

    y1=p.valor(201:400);
    y2=p.valor(601:800);
    y3=p.valor(1401:2000);

     scatter(x1,y1,'k+')
     hold on
     scatter(x2,y1,'b.')
     hold on
     scatter(x3,y1,'ro')

и

y1=p.valor(201:400);
y2=p.valor(601:800);
y3=p.valor(1401:2000);


plot(x1,y1,'k+')
hold on
plot(x2,y2,'b.')
hold on
plot(x3,y3,'ro')

Мои цифры имеют правильные оси, но нанесенные значения не соответствуют правильному представленному рисунку (см. начало вопроса).

Итак, мой вопрос: как мне включить значения во второй строке в p.valor в мою графическую фигуру?

Я надеюсь, что это яснее!


person MatlabNoob    schedule 20.09.2013    source источник


Ответы (2)


К значениям из обеих строк одновременно можно получить доступ, используя этот синтаксис:

X=p.value(:,findX)

В этом случае результирующая матрица X будет матрицей, имеющей 2 строки и length(findX) столбца.

person freude    schedule 20.09.2013
comment
Я добавил свой код к вопросу, чтобы вы могли видеть, как я пытался применить то, что вы сказали. Однако, когда я делаю это, я получаю фигуру со всеми правильными значениями y, но только 1 и 2 для значений x. Моя фигура должна выглядеть примерно так: эта - person MatlabNoob; 20.09.2013
comment
@MatlabNoob, если у вас есть набор инструментов статистики, вам следует проверить функцию gscatter. - person Dan; 20.09.2013

M = magic(5)

M =

   17   24    1    8   15
   23    5    7   14   16
    4    6   13   20   22
   10   12   19   21    3
   11   18   25    2    9

M2 = M(1:2, :)

M2 =

   17   24    1    8   15
   23    5    7   14   16

Matlab использует основную индексацию столбца. Таким образом, чтобы перейти к следующей строке, вам на самом деле просто нужно добавить 1. Добавление 2 к индексу в M2 приводит вас к следующему столбцу или добавление 5 к индексу в M

например M2(3) это 24. Чтобы перейти к следующей строке, вы просто добавляете одну, т.е. M2(4) возвращает 5. Чтобы перейти к следующему столбцу, добавьте количество строк, чтобы M2(2 + 2) получило 1. Если вы добавите количество столбцов, как вы предложили, вы просто получите тарабарщину.

Так что ваш метод очень неправильный. Метод Фрейда верен на 100%, для этого гораздо проще использовать индексацию индексов, чем линейную индексацию. Но я просто хотел объяснить, почему то, что вы пытались, не работает в Matlab. (помимо того факта, что X=p.value(findX findX+1000) дает вам синтаксическую ошибку, я предполагаю, что вы имели в виду X=p.value([findX findX+1000]))

person Dan    schedule 20.09.2013
comment
Благодарю вас! Я также пытался использовать основную индексацию столбцов, написав x1=p.valor(f1); y1=p.valor(f1+1); plot(x1,y1,'r.'), но график, который я получаю, теперь имеет ось x, охватывающую от 0 до 600 (то есть количество столбцов), когда мои значения охватывают только от -6 до 6 , Что я могу сделать, чтобы было ясно, что я хочу построить значения чисел в определенных местах, а не само место? - person MatlabNoob; 20.09.2013
comment
@MatlabNoob, извини, я не слежу за тобой. - person Dan; 20.09.2013
comment
Да, извини, я не слежу за собой @Dan. Я обновлю свой вопрос, чтобы его было легче понять - person MatlabNoob; 20.09.2013
comment
@MatlabNoob Хорошо, я думаю, это то, что вы хотите: plot(x1(:,1), x1(:,2),'r.') - person Dan; 20.09.2013
comment
Хм, попалась мне фигурка всего с тремя символами. Я отредактировал сейчас для большей ясности. Еще раз спасибо @Dan - person MatlabNoob; 20.09.2013