Comparing the entries of matrix in pairs

3 views (last 30 days)
Problem: I have a matrix A (of n by m dimension) which for this example is 10 by 3. Now I want to compare the entries of the matrix which are at unit distance apart like A(1,1) and A(1,2), then A(1,2) and A(1,3), and so on till A(1,m-1) and A(1,m) . I want to do this for each row till 10 in this case. I check if the A(1,m) -th entry is greater than or equal to 1 and if it is I store that index and the value of the matrix.
Example: This is the my matrix A. Now A(1,1) = 0 and A(1,2) = 0. I check A(1,2) is not greater/equal to 1 and hence I skip and go ahead. A(1,2)=0 and A(1,3) = 3 and A(1,3) is greater/equal to 1 and hence I store the row index , pair (2,3) and value of the matrix 3 in an separate array. So my array would show (1,2,3,3).
(row, pair, value)
| | |
1 (2,3) 3
If I now go to second row, A(2,1) = 0 and A(2,2) = 1 (>=) 1 and hence I have in array (2,1,2,1)
(row, pair, value)
| | |
2 (1,2) 1
In the same row, I have A(2,2)=1 and A(2,3) = 2 >= 1 and hence I have in array (2,2,3,2)
(row, pair, value)
| | |
2 (2,3) 2
My attempt:
N = 3;
M = 3;
%making matrix A
a = nchoosek(1:M+N-1,N-1);
s = size(a,1);
b = [zeros(s,1) a (M+N)*ones(s,1)];
A = diff(b,[],2)-1;
D = nchoosek(N+M-1, N);
% making arrays
arr = zeros();
for v=1:D %v is basically running till 10 in this case
for i= 1:M
for j= 2:M
if A(i,j)-A(1,j-1) >=1
arr(v,1) = v;
arr(v,2) = j-1;
arr(v,3) = j;
arr(v,4) = A(v,j);
end
end
end
end
The above code seems to miss several of the values and doesn't seem to work. One thing I tried was using nchoosek to make pairs beforehand and check for those pairs in the matrix A. This didn't pan out. Any help would helpful.
Thank You.

Accepted Answer

Jonas
Jonas on 3 May 2021
i hope i understood you correctly, first index is row index, the pair is the pair of compared column index and the last value is the bigger of the two values if at least one of them is 1 or bigger
data=[0 0 1; 1 8 2; 2 3 3; 3 1 1]
greaterOrEqual=(data(:,2:3)+data(:,1:2))>=1;
[rowIdx,colIdx]=find(greaterOrEqual);
pairsOfColumnIdx=[colIdx colIdx+1];
respectiveBiggerValue=nan(numel(colIdx),1);
for valNr=1:numel(rowIdx)
respectiveBiggerValue(valNr)=data(rowIdx(valNr),colIdx(valNr)+1);
end
[rowIdx pairsOfColumnIdx respectiveBiggerValue]
  2 Comments
Vira Roy
Vira Roy on 3 May 2021
Thanks Jonas. This worked and I am accepting the answer. Can I ask one another thing related to the output of your program. Can i sort the rows in ascending order Right now it is 2,3,4,1,2,3,4. can i make it 1,2,2,3,3,4,4.
Anyways Thank you so much for the help.
Jonas
Jonas on 3 May 2021
if you want to sort the rows according to any column entries (e.g. column 1) you can use e.g. sortrows(data,1), which sorts according to values in column 1 in ascending order

Sign in to comment.

More Answers (0)

Categories

Find more on Shifting and Sorting Matrices in Help Center and File Exchange

Products


Release

R2021a

Community Treasure Hunt

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

Start Hunting!