find all the possible pairs with postive elements from a given matrix

조회 수: 1 (최근 30일)
Hi everybody, I have a specefic Problem to solve which a little bit complicated. lets say i have a 3*3 matrix(rows are the outputs and columns are the inputs ) with negative and positive values.
example:
A= [0.1 -1.5 -0.1;
-5.2 1.7 1.8;
2.9 -3.1 0.1]
so the possible pairs will be :
A(1,1) A(2,2) A(2,3)
A(1,1) A(2,2) A(3,3)
A(3,1) A(2,2) A(2,3)
A(2,1) A(2,2) A(3,3)
so that every inputs become an output with the condition of the positive coresponding element.
any propositions or keywords or functions to solve this specific problem ?

채택된 답변

Andrei Bobrov
Andrei Bobrov 2017년 10월 16일
t = A > 0;
k = (1:size(A,1))'.*t;
p = arrayfun(@(x)k(k(:,x) > 0,x),1:size(A,2),'un',0);
jj = cellfun(@numel,p);
ii = flip(fullfact(flip(jj,2)),2);
out = A(t);
out = out(ii+[0,cumsum(jj(1:2))])

추가 답변 (2개)

Guillaume
Guillaume 2017년 10월 16일
Another way to open the same result:
A = [0.1 -1.5 -0.1;
-5.2 1.7 1.8;
2.9 -3.1 0.1];
B = cellfun(@(col) col(col>0), num2cell(A, 1), 'UniformOutput', false);
[B{:}] = ndgrid(B{:});
B = reshape(cat(4, B{:}), [], 3)
  댓글 수: 1
Andrei Bobrov
Andrei Bobrov 2017년 10월 17일
편집: Andrei Bobrov 2017년 10월 17일
Super! (my favorite tools), +1! Small edit:
B = cellfun(@(col) col(col>0), num2cell(A, 1), 'UniformOutput', false);
[B{end:-1:1}] = ndgrid(B{end:-1:1});
B = reshape(cat(4, B{:}), [], 3);

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


Cedric
Cedric 2017년 10월 16일
편집: Cedric 2017년 10월 16일
It looks like you want triplets, or I don't understand the question:
>> posUnique = unique( A(A > 0) )
posUnique =
0.1000
1.7000
1.8000
2.9000
>> ids = nchoosek( 1:numel(posUnique), 3 )
ids =
1 2 3
1 2 4
1 3 4
2 3 4
>> B = Apos(ids)
B =
0.1000 2.9000 1.7000
0.1000 2.9000 1.8000
0.1000 1.7000 1.8000
2.9000 1.7000 1.8000
  댓글 수: 4
Cedric
Cedric 2017년 10월 16일
I'm voting for Andrei! Next time I'll remember FULLFACT instead of creating a volume ..

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

카테고리

Help CenterFile Exchange에서 Particle & Nuclear Physics에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by