[prev in list] [next in list] [prev in thread] [next in thread]
List: scilab-users
Subject: Re: [scilab-Users] Using find on matrices
From: "Eric Dubois" <grocer.toolbox () gmail ! com>
Date: 2008-04-08 15:32:44
Message-ID: b04eeae20804080832y762a0693h24ab66eb1a30a049 () mail ! gmail ! com
[Download RAW message or body]
What does the winner of this logical contest win? ;-)
Anyway, I have an exact and an approximate solution (if the only problem is
to avoid loops!):
- first problem:
--> A((jj-1)*size(A,1)+ii) = 5
- second problem:
--> B= matrix(A,-1,1)
--> C=matrix(B,-1,1) .*. ones(1,size(v,2)) - ones(size(C,1),1) .*. v
--> D=C(:,2:$) <0 & C(:,1:$-1) >=0
--> [f1,f2]=find(D)
which provides the result you want (although presented slightly diffrently,
but I do not know if it makes a difference for your uses).
Eric.
2008/4/7, harishankar ramachandran <hsr@ee.iitm.ac.in>:
>
> Hi all,
>
> If I have a matrix "A", and I apply a condition on it, I can extract the
> indices for which the condition is true, and I can then use that vector to
> change those values. For eg:
>
> indx=find(A>4);
> A(indx)=5;
>
> There is also a double index version of find, where I can get the (i,j)
> coordinates of the points. However, I do not seem to be able to use the
> following code:
>
> [ii,jj]=find(A>4);
> A(ii,jj)=5;
>
> This instead assigns 5 to a submatrix of A defined by rows ii and columns
> jj.
>
> What is the proper way to vectorially assign values to elements of a
> matrix A,
> if I have the element locations in the form [ii,jj]? Without a for loop,
> that
> is.
>
> Another question: Suppose I have a set of disjoint conditions with which I
> wish to partition a matrix. How do I extract the corresponding elements
> with
> a single command? This seems like a very useful capability, but I don't
> find
> anyway to do this without using a for loop. Eg:
>
> A=int(rand(5,5)*12);
> v=0:2:12;
> l=list()
> for k=1:length(v)-1
> l(k)=find(A>=v(k) & A<v(k+1));
> end
>
> This yields:
> A =
>
> 2. 7. 6. 2. 3.
> 9. 10. 7. 2. 11.
> 0. 8. 8. 2. 2.
> 3. 10. 2. 10. 3.
> 7. 0. 6. 7. 4.
>
> l =
> l(1) = 3. 10.
> l(2) = 1. 4. 14. 16. 17. 18. 21. 23. 24.
> l(3) = 25.
> l(4) = 5. 6. 11. 12. 15. 20.
> l(5) = 2. 8. 13.
> l(6) = 7. 9. 19. 22.
>
> But can I do it faster, without for loops? I would like to have a command
> that
> does:
>
> A=int(rand(5,5)*12);
> v=0:2:12;
> l=findmany(A>=v(1:$-1) & A<v(2:$));
>
> or something like that. Is there some such thing?
>
> Thanks in advance
>
> hari ramachandran
> --
> Dr. Hari Ramachandran, EE Dept, IIT-Madras
>
[Attachment #3 (text/html)]
<div>What does the winner of this logical contest win? ;-)</div>
<div> </div>
<div>Anyway, I have an exact and an approximate solution (if the only problem is \
to avoid loops!):</div> <div> </div>
<div>- first problem: </div>
<div>--> A((jj-1)*size(A,1)+ii) = 5</div>
<div> </div>
<div>- second problem:</div>
<div>--> B= matrix(A,-1,1)</div>
<div>--> C=matrix(B,-1,1) .*. ones(1,size(v,2)) - ones(size(C,1),1) .*. v</div>
<div>--> D=C(:,2:$) <0 & C(:,1:$-1) >=0</div>
<div>--> [f1,f2]=find(D)</div>
<div> </div>
<div>which provides the result you want (although presented slightly diffrently, but \
I do not know if it makes a difference for your uses).</div> <div> </div>
<div>Eric.<br><br> </div>
<div><span class="gmail_quote">2008/4/7, harishankar ramachandran <<a \
href="mailto:hsr@ee.iitm.ac.in">hsr@ee.iitm.ac.in</a>>:</span> <blockquote \
class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: \
#ccc 1px solid">Hi all,<br><br>If I have a matrix "A", and I apply a \
condition on it, I can extract the<br>indices for which the condition is true, and I \
can then use that vector to<br> change those values. For \
eg:<br><br>indx=find(A>4);<br>A(indx)=5;<br><br>There is also a double index \
version of find, where I can get the (i,j)<br>coordinates of the points. However, I \
do not seem to be able to use the<br> following \
code:<br><br>[ii,jj]=find(A>4);<br>A(ii,jj)=5;<br><br>This instead assigns 5 to a \
submatrix of A defined by rows ii and columns jj.<br><br>What is the proper way to \
vectorially assign values to elements of a matrix A,<br> if I have the element \
locations in the form [ii,jj]? Without a for loop, that<br>is.<br><br>Another \
question: Suppose I have a set of disjoint conditions with which I<br>wish to \
partition a matrix. How do I extract the corresponding elements with<br> a single \
command? This seems like a very useful capability, but I don't find<br>anyway to \
do this without using a for loop. \
Eg:<br><br>A=int(rand(5,5)*12);<br>v=0:2:12;<br>l=list()<br>for \
k=1:length(v)-1<br>l(k)=find(A>=v(k) & A<v(k+1));<br> end<br><br>This \
yields:<br>A =<br><br> \
2. 7. \
6. 2. 3.<br> \
9. 10. 7. 2. \
11.<br> 0. 8. \
8. 2. 2.<br> \
3. 10. 2. 10. 3.<br> \
7. 0. \
6. 7. 4.<br><br>l =<br> \
l(1) = 3. 10.<br> l(2) = \
1. 4. 14. 16.&nbs \
p; 17. 18. 21. 23. 24.<br> \
l(3) = 25.<br> l(4) = \
5. 6. 11. 12. 15. 20.<br> \
l(5) = 2. 8. 13.<br> l(6) = \
7. 9. 19. 22.<br>
<br>But can I do it faster, without for loops? I would like to have a command \
that<br>does:<br><br>A=int(rand(5,5)*12);<br>v=0:2:12;<br>l=findmany(A>=v(1:$-1) \
& A<v(2:$));<br><br>or something like that. Is there some such thing?<br> \
<br>Thanks in advance<br><br>hari ramachandran<br>--<br>Dr. Hari Ramachandran, EE \
Dept, IIT-Madras<br></blockquote></div><br>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic