how to do this calculation not by 'for' cycle?

1 view (last 30 days)
I have the below data:
data =[...
1.0000 1.0000 1.0000 53.1100;...
1.0000 2.0000 2.0000 59.0900;...
2.0000 1.0000 2.0000 71.3100;...
2.0000 2.0000 1.0000 70.2400]
Now I want to get a 'variable'--Data as below:
Data=[53.11+59.09 53.11+71.31 53.11+70.24;
71.31+70.24 59.09+70.24 59.09+71.31]
I can get 'Data' by 'for' cycle function but I want to do this work by other better method.
The addition logic is that:
take column 2 of data for example, both data(1,2) and data(3,2) equal 1.0000, so add data(1,4) and data(3,4) to get Data(1,2).

Accepted Answer

Guillaume
Guillaume on 15 Dec 2015
One possible way to do it:
data = [1 1 1 53.1100
1 2 2 59.0900
2 1 2 71.3100
2 2 1 70.2400];
%first split data into two matrices for easier referencing:
rowdest = data(:, 1:end-1);
rowvals = data(:, end);
%second create matrix of column indices
coldest = repmat(1:size(rowdest, 2), size(rowdest, 1), 1);
%third use accumarray to compute the sum:
newdata = accumarray([rowdest(:) coldest(:)], repmat(rowvals, size(rowdest, 2), 1))

More Answers (1)

Stephen23
Stephen23 on 15 Dec 2015
Edited: Stephen23 on 15 Dec 2015
This is easy using accumarray:
inp = [1,1,1,53.1100;1,2,2,59.0900;2,1,2,71.3100;2,2,1,70.2400]
out(:,3) = accumarray(inp(:,3),inp(:,4));
out(:,2) = accumarray(inp(:,2),inp(:,4));
out(:,1) = accumarray(inp(:,1),inp(:,4))
and the result is:
out =
112.20 124.42 123.35
141.55 129.33 130.40
and your example output is:
>> [53.11+59.09,53.11+71.31,53.11+70.24;71.31+70.24,59.09+70.24,59.09+71.31]
ans =
112.20 124.42 123.35
141.55 129.33 130.40
  1 Comment
Guillaume
Guillaume on 15 Dec 2015
If data is always three columns of indices + one column of number, this works. If the size of data is not fixed, my answer is more generic.

Sign in to comment.

Categories

Find more on Multidimensional Arrays in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!