2015-05-19 5 views
1

Я читаю некоторые данные с их атрибутом (например, A, в котором первая строка является идентификатором, а вторая строка - их значением атрибута). Я хотел бы разместить такие данные в ячейке, где первый столбец является уникальным идентификатором и второй строкой их атрибута. всякий раз, когда есть повторяющиеся значения для атрибута, я буду размещать вакансию, доступную на передней части ее строки. например, я хотел бы построить CРазмер внутренних элементов ячеек

A = 
1  2  3  2 
2  4  5  9 

C{1}= 
1 2 0 
2 4 9 
3 5 0 

, когда я собираюсь проверить размер внутренних домов в ячейке, например.

size(C{1},2) 

ans = 3 

size(C{1},1) 

ans = 3 

size(C{1}(1,:),2) 

ans = 3 

Все возвращают 3, так как он занимает пустые дома с 0. Так как я должен понимать, куда девать свои новые данные (например, (1,5))? Должен ли я пересекать или находить место 0 и вставлять туда? Спасибо за любую помощь.

+0

Использование 'find (C {1} (j, :) == 0,1)' действительно должно работать для j-й строки, но имейте в виду, что если вся строка заполнена, find вернет пустой массив индексов , [Но почему бы не использовать контейнер карты Matlabs, заполненный списками] (http://nl.mathworks.com/help/matlab/map-containers.html)? – Lanting

+0

Итак, сначала я должен проверить, содержит ли он 0 или не использует ismember или найти, чтобы найти первый индекс ненулевого элемента, и если он вернулся пустым, я использую конец + 1 для вставки новых элементов. Я должен использовать это много раз в своем коде. Каково главное преимущество контейнера карты со списком? ячейка не делает то же самое? – hamideh

+0

@hamideh Вы не должны делать это каждый раз. Вы могли бы сделать это за один раз. Я отправил ответ. проверьте это :) –

ответ

1

Почему бы не использовать массив ячеек для такого рода проблем? Как вы создали свою матрицу C?

Несмотря на то что вы использовали клеточные массивы для матрицы C, каждый элемент C является матрицей в вашем случае, так что размеры должны быть постоянными.

Я использовал массив ячеек внутри матрицы. (то есть), каждый элемент принимает свой собственный размер на основе повторяющихся размеров. например, вы могли видеть, что C{2,2} имеет два значения, а C{1,2} и C{3,2} имеет только один значения. вы можете легко проверить их размер, не проверяя нули. Обратите внимание, что даже если любые значения равны нулю, этот код будет работать.

Первый столбец матрицы представляет identifiers, а второй столбец представляет values, который принимает свой собственный размер в зависимости от количества дубликатов.

Вот моя реализация, используя accumarray и unique для генерации C как массива ячеек.

Код:

C = [num2cell(unique(A(1,:).')), accumarray(A(1,:).',A(2,:).',[],@(x) {x.'})] 

Ваш образец входного:

A = [1  2  3  2; 
    2  4  5  9]; 

Выход:

>> C 

C = 

[1] [   2] 
[2] [1x2 double] 
[3] [   5] 

>> size(C{2,2},2) 

ans = 

2 

>> size(C{1,2},2) 

ans = 

1 

С DOC

Примечание: Если индексы в подлодках не сортируется по их линейным индексам, то accumarray не всегда может сохранить порядок данных в val, когда он передает их fun. В необычном случае, когда fun требует, чтобы его входные значения были в том же порядке, что и в val, сортируйте индексы в subs относительно линейных индексов вывода.


Другой пример:
Входной сигнал:

A = [1 2 1 2 3 1; 
    2 4 5 9 4 8]; 

Выход:

C = 

[1] [1x3 double] 
[2] [1x2 double] 
[3] [   4] 

Надеюсь, что это поможет!

+0

далее, для общего случая двухмерного массива ячеек. например 'a', который в конце представляет собой ячейку 3 * 3' a = [2x1 double] [2x1 double] [2x1 double]; [1] [2x1 double] []; [1] [] [] 'Теперь для количества строк в первом столбце мы можем использовать size (a, 1), но как определить число непустых ячеек во втором столбце, например (что равно 2)? – hamideh

+1

@hamideh 'sum (~ cellfun (@isempty, A))' это даст количество непустых ячеек для каждого столбца –

+0

Wow, awesome, большое вам спасибо, это точно работает! – hamideh

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