How can I do matrix indexing

조회 수: 3 (최근 30일)
Ashraf Sherif
Ashraf Sherif 2019년 2월 8일
댓글: Ashraf Sherif 2019년 2월 12일
I want to select 3 elements from the matrix C, one element from each column, the selecting will be regarding to the maximum value in in each column in matrix f.
C=
41.0875 66.4048 31.5374
84.3670 25.9733 73.1052
68.8608 99.4798 75.5581
the vector needed like this [ 68.8608 66.4048 73.1052 ]
f=
1.0027 0.9766 1.2106
0.4001 0.5136 1.8174
1.5451 0.9488 0.8571
and because this values and positions are subject to change randomly
any help will be very thankful
  댓글 수: 1
KSSV
KSSV 2019년 2월 8일
REad about max

댓글을 달려면 로그인하십시오.

채택된 답변

Stephen23
Stephen23 2019년 2월 8일
편집: Stephen23 2019년 2월 8일
A simple and reliable solution using linear indexing:
>> f = [1,22,333;4,33,111;1,4,33]
f =
1 22 333
4 33 111
1 4 33
>> C = [41.0875,66.4048,31.5374;84.3670,25.9733,73.1052;68.8608,99.4798,75.5581]
C =
41.087 66.405 31.537
84.367 25.973 73.105
68.861 99.480 75.558
>> [vec,idx] = max(f,[],1); % value and row index of max in each column.
>> S = size(f); % size of input array.
>> idx = idx + S(1)*(0:S(2)-1); % convert row index into linear index.
>> out = C(idx) % use linear index to get elements of C.
out =
84.367 25.973 31.537
>> vec
vec =
4 33 333
  댓글 수: 2
Ashraf Sherif
Ashraf Sherif 2019년 2월 8일
yeah you are completly right Mr. Stephen Cobeldick and it is work well, thank you a lot,
Ashraf Sherif
Ashraf Sherif 2019년 2월 12일
How to add a row vector when my M is 4 dimensional
F=random('exp',1,3,3,4);
C=F*100
M=bsxfun(@times, C./cumsum(C,3) , reshape(1:4,1,1,[]) );
[vec,idx] = max(M,[],1); % value and row index of max in each column.
S = size(M); % size of input array.
idx = idx + S(1)*(0:S(2)-1); % convert row index into linear index !
C(idx) % use linear index to get elements of C.

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

madhan ravi
madhan ravi 2019년 2월 8일
C(any(f(:)==max(f),2)).'
  댓글 수: 13
Stephen23
Stephen23 2019년 2월 8일
Note that this is very fragile code, and it can easily fail when values repeat in matrix f:
>> f = [1,22,333;4,33,111;1,4,33]
f =
1 22 333
4 33 111
1 4 33
>> C = [41.0875,66.4048,31.5374;84.3670,25.9733,73.1052;68.8608,99.4798,75.5581]
C =
41.087 66.405 31.537
84.367 25.973 73.105
68.861 99.480 75.558
>> C(any(f(:)==max(f),2)).'
ans =
84.367 25.973 99.480 31.537 75.558 % <- why five output values?
See my answer for code that actually delivers what the question asked for: " I want to select 3 elements from the matrix C, one element from each column..."
madhan ravi
madhan ravi 2019년 2월 8일
Agree with Stephen , @Ashraf accept Stephen's answer.

댓글을 달려면 로그인하십시오.


Ashraf Sherif
Ashraf Sherif 2019년 2월 8일
Yes It's work I tried it on MATLAB cloud by my phone. thank you very much my friend.

Ashraf Sherif
Ashraf Sherif 2019년 2월 8일
편집: Ashraf Sherif 2019년 2월 8일
Mr. Stephen Cobeldick and Mr. madhan ravi I appreciate you help, this was sloved my problem when I have a simple matrix 3 by 3, but now am facing an other problem that when I want to calculate new index matrix. here is my code with some explaining for what am looking for
clear all
close all
clc
for u=[2:30]% the size of matrix
x1=[];x2=[];x3=[];x4=[];x5=[];x6=[];x6=[];x7=[];x8=[];x9=[];% this is number of elements in may matrix when it was 3 by 3
for i=1:4 % number of itteration (time slot in my case)
f=random('exp',1,u,20); % size of matrix will change from 2 by 20 up to 30 by 20
Pt=1; % Transmit power 1 watt
B=50*10^3; % Bandwidth = 50 KHz * 10^3 Hz
d=5; % Distance 5 meter
lamda= -3; % Used in Urban area
No=10^-8; % AWGN noise
SNR=Pt*d^lamda*f/(B*No); % Signal-to-Noise Ratio
%% Capacity when Max-SNR and Proportional Fairness %%
C=(B/3*log2(1+SNR))/1000; % matrix of my data
% calculting the instantaneous data rate / average data rate for each user
%1- Instantaneous values of elements
x1=[x1;C(1,1)]; x2=[x2;C(1,2)];x3=[x3;C(1,3)];x4=[x4;C(2,1)];x5=[x5;C(2,2)];x6=[x6;C(2,3)];x7=[x7;C(3,1)];x8=[x8;C(3,2)];x9=[x9;C(3,3)];
% 2- Average of each elements during for example 4 itterations
M1=C(1,1)/mean(x1);M2=C(1,2)/mean(x2);M3=C(1,3)/mean(x3);M4=C(2,1)/mean(x4);M5=C(2,2)/mean(x5);M6=C(2,3)/mean(x6);M7=C(3,1)/mean(x7);M8=C(3,2)/mean(x8);M9=C(3,3)/mean(x9);
% this is my index matrix
PFindex=[M1,M2,M3;M4,M5,M6;M7,M8,M9];
maxPF=[max([M1,M4,M7]), max([M2,M5,M8]), max([M3,M6,M9])];
MaxSNR=sum(max(C))
% Capacity with Proportional Fairness
[vec,idx] = max(PFindex,[],1); % value and row index of max in each column.
S = size(PFindex); % size of input array.
idx = idx + S(1)*(0:S(2)-1); % convert row index into linear index.
PF = sum(C(idx)) % use linear index to get elements of C.
end
end
fainally I'm collecting Values of MaxSNRs and PF, thank you any way.
  댓글 수: 2
Stephen23
Stephen23 2019년 2월 9일
편집: Stephen23 2019년 2월 9일
Replace all of those numbered variables, use indexing instead.
Numbered variables are a sign that you are doing something wrong.
Ashraf Sherif
Ashraf Sherif 2019년 2월 9일
Thank you Stephen that what am going to do

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by