How to rearrange values in a matrix

Hello, I have a large matrix with 3 columns(x,y,and z) and I want to rearrange the values inside this matrix. Example:
*Initial matrix
x y z
1 1 5
1 2 6
1 3 7
2 1 8
2 2 9
2 3 2
*Final matrix My goal is to rearrange the values of the matrix in this form
y
x 1 2 3
1 5 6 7 <-z values
2 8 9 2

 Respuesta aceptada

Sean de Wolski
Sean de Wolski el 4 de Nov. de 2013
There are a few elegant ways to do this. I would use accumarray
data = [
1 1 5
1 2 6
1 3 7
2 1 8
2 2 9
2 3 2];
V = accumarray(data(:,[1 2]),data(:,3))
Now V does not have the index values, but you already know them:
rr = 1:size(V,1) %row
cc = 1:size(V,2) %column
So I would just keep them separate.

5 comentarios

afrya
afrya el 4 de Nov. de 2013
Thanks for your answer, could you tell me an another way to rearraenge the values and keeping the index values inside the matrix?
Sean de Wolski
Sean de Wolski el 4 de Nov. de 2013
Editada: Sean de Wolski el 4 de Nov. de 2013
See Andrei's answer below.
Or add to mine:
V = [[nan cc];[rr(:),V]]]
afrya
afrya el 4 de Nov. de 2013
Thanks
afrya
afrya el 4 de Nov. de 2013
When I'm working with decimal numbers,I have the following error
x =
0.6000 0.6000 5.0000
0.6000 0.8000 6.0000
0.6000 0.9000 7.0000
0.8000 0.6000 8.0000
0.8000 0.8000 9.0000
0.8000 0.9000 2.0000
>> V = accumarray(x(:,[1 2]),x(:,3)) Error using accumarray First input SUBS must contain positive integer subscripts.
Do you know how to solve this problem?
Andrei Bobrov
Andrei Bobrov el 4 de Nov. de 2013
see my answer

Iniciar sesión para comentar.

Más respuestas (1)

Andrei Bobrov
Andrei Bobrov el 4 de Nov. de 2013
Editada: Andrei Bobrov el 4 de Nov. de 2013
xyz = [1 1 5
1 2 6
1 3 7
2 1 8
2 2 9
2 3 2];
out = nan(max(xyz(:,1:2))+1);
out(2:end,1) = unique(xyz(:,1));
out(1,2:end) = unique(xyz(:,2));
out(2:end,2:end) = accumarray(xyz(:,1:2),xyz(:,3));
ADD
x =[ 0.6000 0.6000 5.0000
0.6000 0.8000 6.0000
0.6000 0.9000 7.0000
0.8000 0.6000 8.0000
0.8000 0.8000 9.0000
0.8000 0.9000 2.0000];
[r,ii,ii] = unique(x(:,1));
[c,jj,jj] = unique(x(:,2));
v = accumarray([ii,jj],x(:,3));
out = [nan,c';r,v];

6 comentarios

afrya
afrya el 4 de Nov. de 2013
Thanks for your answer
afrya
afrya el 3 de Abr. de 2014
Hello,
I'm working with a large matrix that contains a lot of zero values.When I transform this matrix from a list table to a cross table, I have more zero values in it.I want to keep all the initial zeros values in it and supress all the zero values added from matlab for the calculation of the average.Here is an example of what I want to do:
x=
0.6000 0.6000 5.0000
0.6000 0.8000 6.0000
0.6000 0.8500 0
0.6000 0.8200 0
0.8000 0.8000 9.0000
0.8000 0.9000 2.0000
List table to cross table
NaN 0.6000 0.8000 0.8200 0.8500 0.9000
0.6000 5.0000 6.0000 0 0 0 Average1
0.8000 0 9.0000 0 0 2.0000 Average2
Average1=(5+6+0+0)/4=2,75
Average2=(9+2)/2=5,5 Thanks in advance
x=[ 0.6000 0.6000 5.0000
0.6000 0.8000 6.0000
0.6000 0.8500 0
0.6000 0.8200 0
0.8000 0.9000 2.0000
0.8000 0.8000 9.0000];
[rc,~,c1] = arrayfun(@(ii)unique(x(:,ii)),1:2,'un',0);
v = accumarray([c1{:}],x(:,3));
out = [nan,rc{2}',nan;rc{1},v,sum(v,2)./sum(v>0,2)];
or other last row
out = [nan,rc{2}',nan;rc{1},v,sum(v,2)./numel(rc{2})];
afrya
afrya el 5 de Abr. de 2014
Thank you for your answer,it helped me. Now, what I want to do is to calculate the average for each row but without taking into account the zeros added by matlab.
1st row: there is only one zero added by matlab for this coordinate(0.6;0.9) So , i would like to calculate this average: Average1=(5+6+0+0)/4=2.75
2nd row: there is 3 zeros added by matlab for this coordinates(0.8;0.6),(0.8;0.82),(0.8;0.85) so i'd like to calculate this average, Average2=(9+2)/2=5.5
I have no idea how to do that knowing that i'm working with a large matrix, thanks in advance
another variant of last row
out = [nan,rc{2}',nan;rc{1},v,accumarray(c1{1},x(:,3),[],@mean)];
afrya
afrya el 6 de Abr. de 2014
Thanks for your help, it works now

Iniciar sesión para comentar.

Categorías

Más información sobre Matrices and Arrays en Centro de ayuda y File Exchange.

Preguntada:

el 4 de Nov. de 2013

Comentada:

el 6 de Abr. de 2014

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by