2012-01-24 6 views
0

В разных строках matlab имеется несколько совпадений значений, например 1 1 в первой и второй строке. Я хочу удалить все эти дубликаты, но добавив значения в третий столбец. В случае 1 1 это будет 7. Наконец, я хочу создать матрицу подобия, как показано ниже в ответе. Я не имею в виду значения 2 * в диагоналях, потому что я не буду рассматривать диагональные элементы в дальнейшей работе. Код ниже делает это, но не векторизован. Может ли это быть каким-то образом векторизованным. Пример приведен ниже.Векторизация суммы уникальных столбцов

datain = [ 1 1 3; 
     1 1 4; 
     1 2 5; 
     1 2 4; 
     1 2 3; 
     1 3 8; 
     1 3 7; 
     1 3 12; 
     2 2 22; 
     2 2 77; 
     2 3 111; 
     2 3 113; 
     3 3 456; 
     3 3 568]; 
cmp1=unique(datain(:,1)); 
cmp1sz=size(cmp1,1); 
cmp2=unique(datain(:,2)); 
cmp2sz=size(cmp2,1); 
thetotal=zeros(cmp1sz,cmp2sz); 

for i=1:size(datain,1) 
for j=1:cmp1sz 
    for k=1:cmp2sz 
     if datain(i,1)==cmp1(j,1) && datain(i,2)== cmp2(k,1) 
      thetotal(j,k)=thetotal(j,k)+datain(i,3); 
      thetotal(k,j)=thetotal(k,j)+datain(i,3); 
     end 
    end 
end 
end 

Ответ

14   12   27 

12   198   224 

27   224  2048 

ответ

4

Это плакат случай для использования ACCUMARRAY.

thetotal = accumarray(datain(:,1:2),datain(:,3),[],@sum,0); 

%# to make the array symmetric, you simply add its transpose 

thetotal = thetotal + thetotal' 

thetotal = 
      14   12   27 
      12   198   224 
      27   224  2048 

EDIT

Так что, если datain не содержит только целые значения? В этом случае вы все равно можете построить таблицу, но, например, thetotal(1,1) не соответствует datain(1,1:2) == [1 1], но до наименьшей записи в первых двух столбцах datain.

[uniqueVals,~,tmp] = unique(reshape(datain(:,1:2),[],1)); 
correspondingIndices = reshape(tmp,size(datain(:,1:2))); 
thetotal = accumarray(correspondingIndices,datain(:,3),[],@sum,0); 

Значение по [1 1] Теперь соответствует строке [uniqueVals(1) uniqueVals(1)] в первых двух перевалы из datain.

+0

Однажды я действительно должен научиться использовать ACCUMARRAY. – Edric

+0

@ Edric: really :) – Jonas

+0

@Jonas: Как я могу заставить его работать для чисел с плавающей запятой? – discipulus

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