フィルターのクリア

How to write a code for 3 Variables

3 ビュー (過去 30 日間)
Gokhan Kayan
Gokhan Kayan 2018 年 3 月 25 日
コメント済み: Gokhan Kayan 2018 年 3 月 27 日
I want to write a code to obtain a new value array that is dependent to 3 variables. My 3 variables are like the table shown below:
A B C
1 400 200
1 500 100
2 455 300
2 200 400
3 100 500
3 500 600
2 600 100
3 700 900
1 800 150
2 900 150
I want to calculate new 'D' array from A,B,C. My code should be like this if A=1 then calculate the sum of B and divide it to sum of C.
For example we have 3 row that A=1 and we have B=400,500,900 C=200,100,150 for A=1. So it shoulde be 400 +500+900 /200+100+150. The result (D) is 4 for A=1. I have so many A values and ı don't know how to calculate all of them. If you help me, I will be very happy. Thank you.

採用された回答

John D'Errico
John D'Errico 2018 年 3 月 25 日
編集済み: John D'Errico 2018 年 3 月 25 日
Easy peasy. What, 2 lines?
abc = [1 400 200
1 500 100
2 455 300
2 200 400
3 100 500
3 500 600
2 600 100
3 700 900
1 800 150
2 900 150];
[ai,bcsum] = consolidator(abc(:,1),abc(:,2:3),@sum)
ai =
1
2
3
bcsum =
1700 450
2155 950
1300 2000
bcratio = bcsum(:,1)./bcsum(:,2)
bcratio =
3.7778
2.2684
0.65
There is no need for the A values to be integers. As long as they are distinct will suffice.
  1 件のコメント
Gokhan Kayan
Gokhan Kayan 2018 年 3 月 27 日
Thank you very much John this is what I exactly want :)

サインインしてコメントする。

その他の回答 (2 件)

Walter Roberson
Walter Roberson 2018 年 3 月 25 日
sumB = accumarray(A, B);
sumC = accumarray(A, C);
D = sumB ./ sumC;
D(sumB == 0 & sumC == 0) = 0;
This applies directly only if the A values are positive integers, preferably small and consecutive. If they are not positive integers then there is an adjustment that can be made using unique()
The final setting to 0 is for the case where the sum of B and sum of C are both 0, replacing the NaN that would result with 0. The sums could be 0 if the entries can be positive and negative; the sums can also be 0 if there is a gap in the values of A, such as if A might be [1, 2, 4] with no 3 entry.
  1 件のコメント
Gokhan Kayan
Gokhan Kayan 2018 年 3 月 27 日
Thanks Walter :)

サインインしてコメントする。


Geoff Hayes
Geoff Hayes 2018 年 3 月 25 日
Gokhan - you can do
A==1
to return an array of logical values, zeros and ones, that will tell you which element of A is a one (indicated by a one) and which element of A is not a one (indicated by a zero). For example,
A = [1 2 3 4 5 1 1]
then
A==1
returns
1 0 0 0 0 1 1
And so you could then do
sum(B(A==1))
to sum those elements of B that correspond to ones within A. See logical indexing for more details.
  1 件のコメント
Gokhan Kayan
Gokhan Kayan 2018 年 3 月 27 日
Thanks for your respond Geoff :)

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeCreating and Concatenating Matrices についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by