2015-05-13 4 views
2

У меня есть три вектора A, B и C того же размера. A и B - числовые величины, а C - массив ячеек строк. Я хочу создать суб-векторы на основе уникальных значений B и C. Например, пустьСохранение индексов уникальных строк/элементов вектора в MATLAB

A = [0.45 0.89 0.12 0.35 0.40 0.93 0.12 0.35 0.72 0.59]; 
B = [1 1 3 1 8 1 8 8 1 1]; 
C = [{'Tom'}, {'Mary'}, {'Dick'}, {'Harry'}, {'Dick'}, {'Tom'}, {'Tom'}, {'Mary'}, {'Tom'}, {'Mary'}]; 

Итак, я первый пытался найти уникальные значения B и C, используя уникальную функцию MATLAB в. Результаты таковы:

unique(B) 
ans = 
1 3  8 
unique(C) 
ans = 
'Dick' 'Harry' 'Mary' 'Tom' 

Теперь я хочу, чтобы организовать вектор А уникальными значениями в B и C. Пусть индексы уникальных значений первого элемента уникального (B) являются [ row_b1, colb1], индексы второго элемента - [row_b2, colb2] и т. д. Затем, на основе уникальных значений в B, Я хотел бы генерировать следующие три вектора:

A_B1 = A(rowb1, colb1); 
A_B2 = A(rowb2, colb2); 
A_B3 = A(rowb3, colb3); 

Аналогичным образом, на основе уникальных значений С, Я хотел бы генерировать следующие векторы:

A_C1 = A(rowc1, colc1); 
A_C2 = A(rowc2, colc2); 
A_C3 = A(rowc3, colc3); 
A_C4 = A(rowc4, colc4); 

Однако я ничего не нашел в уникальной команде, которая сообщает мне индексы уникальных значений в векторе ie row_b1, col_b1, ... и т. Д. Не могли бы вы указать, как получить эти индексы? Любая помощь будет оценена.

Редактировать 1: Я должен упомянуть, что я опубликовал общий случай. Но в моей проблеме A, B и C есть матрицы. Я понял, могу ли я решить это для вектора, тогда он должен быть аналогичным расширением для матрицы.

Edit2: Вот ответы я ожидаю:

A_B1 = [0.45 0.89 0.35 0.93 0.72 0.59] 
A_B2 = [0.12] 
A_B3 = [0.40 0.12 0.35] 

и

A_C1 = [0.45 0.93 0.12 0.72] 
A_C2 = [0.89 0.35 0.59] 
A_C3 = [0.12 0.40] 
A_C4 = [0.35] 
+0

'A' является вектором, но вы индексировать его как матрицу' A (rowb1, colb1) '. Кажется, вы работаете с векторами, когда ссылаетесь на строки 'row_b1' и' colb1', строку и столбец какой матрицы вы имеете в виду? –

+0

Какой-либо из ответов работает для вас? – brodoll

+0

Привет, Мохсен, см. Мое редактирование. Я отправил случай для вектора. Но в моей проблеме A, B и C могут быть матрицы. – roalddahl14

ответ

1

Вы можете использовать дополнительные выходы уникальной функции в вашу пользу:

[ub ib jb]=unique(B); 

Где UB, И.Б. и ДБ определяются как:

  • UB = уникальный (B);
  • B (ib) = ub;
  • ub (jb) = B;

Что вы можете использовать, чтобы получить ваши ценности a_b:

A_B=A(ib); 

Та же логика применима и к C:

[cu ic jc]=unique(C); 
A_C=A(ic); 

Так как A, B и C являются векторами одного и того же размера.

EDIT

С (rowb1, colb1), (rowb2, colb2) и (rowb3, colb3) просто заполнители, как объяснено в комментариях, что вы действительно хотите, индексы, где появляется каждое уникальное значение и используйте эти индексы, чтобы получить свои значения A. Чтобы получить место, где каждое уникальное значение появляется вы можете использовать:

>> idxA_B=bsxfun(@eq,B,unique(B)') 

ans = 

    1  1  0  1  0  1  0  0  1  1 
    0  0  1  0  0  0  0  0  0  0 
    0  0  0  0  1  0  1  1  0  0 

Так что ваши значения a_b задаются:

A_B1=A(idxA_B(1,:)); 
A_B2=A(idxA_B(2,:)); 
A_B3=A(idxA_B(3,:)); 

Та же логика применима и к С. Но @Parag С. Chandakkar указал вне, @eq не работает со строками, так что вам нужно, чтобы ваши C индексы следующим образом:

aux=cellfun(@(x) strcmp(x,unique(C)'),C,'UniformOutput',false); 
idxA_C = [aux{:}]; 
A_C1=A(idxA_C(1,:)); 
A_C2=A(idxA_C(2,:)); 
A_C3=A(idxA_C(3,:)); 
A_C4=A(idxA_C(4,:)); 
+0

Привет, Brodroll, спасибо. Но это не то, что я ищу. Например, рассмотрим упомянутый мною набор данных.Если я последую последовательности команд в вашем ответе, я получаю: – roalddahl14

+0

Привет, Brodroll, спасибо. Но это не то, что я ищу. Например, рассмотрим упомянутый мною набор данных. Если я следую последовательности команд 'code' [ub jb ib] = unique (B); A_B = A (ib); 'code', это дает A_B = [0.4500 0.1200 0.4000]. Но я хочу следующее: A_B1 = [0,45 0,89 0,35 0,93 0,72 0,59], A_B2 = [0,12] и A_B3 = [0,40 0,12 0,35]. – roalddahl14

+0

Я не совсем понимаю ваше правило индексирования. В конце концов, у вас есть: A_B1 = A ([1 2 4 5 9 10]); A_B2 = А ([3]); A_B3 = A ([5 7 8]). В вашем примере вы указываете, что A_B1 = A (rowb1, colb1), который может быть только одним значением, а не вектором, как я вижу. – brodoll

1

Давайте рассмотрим тот же пример.

A = [0.45 0.89 0.12 0.35 0.40 0.93 0.12 0.35 0.72 0.59]; 
B = [1 1 3 1 8 1 8 8 1 1]; 
C = [{'Tom'}, {'Mary'}, {'Dick'}, {'Harry'}, {'Dick'}, {'Tom'}, {'Tom'}, {'Mary'}, {'Tom'}, {'Mary'}]; 

[uniqueB,indB,~]=unique(B); 
[uniqueC,indC,~]=unique(C); 
A_indB=A(indB); //This and the following line is what you want, I think. 
A_indC=A(indC); 

Это дается в документации unique.

Edit:

Это, как я хотел бы сделать это для матриц (числовой, а также характер).

Сначала создайте некоторые матрицы.

A1=[A;A(randperm(length(A)));A(randperm(length(A)))]; 
B1=[B;B(randperm(length(B)));B(randperm(length(B)))]; 
C1=[C;C(randperm(length(C)));C(randperm(length(C)))]; 

Теперь

indB=arrayfun(@(x) bsxfun(@eq,B1,x),unique(B1),'uni',0); 
indC=arrayfun(@(x) strcmp(C1,x),unique(C1),'uni',0); % above line only works 
                % for numeric arrays 

и получить ответ, как,

A_B1=A(indB{1,1}); 
A_B2=A(indB{2,1}); 
A_C1=A(indC{1,1}); 
A_C2=A(indC{2,1}); % and so on 
+0

Привет Параг, спасибо. см. мои изменения и комментарии. После вашей команды последовательность дает другой результат, чем я хочу. – roalddahl14

+0

@ roalddahl14 Думаю, теперь мое решение должно работать так, как вам было угодно. –

+0

Спасибо Параг! Это решило мою проблему. Он работает как для числовых, так и для строковых матриц! – roalddahl14

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