[scilab-Users] Using find on matrices

Eric Dubois grocer.toolbox at gmail.com
Tue Apr 8 17:32:44 CEST 2008


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 at 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20080408/fd3c842e/attachment.htm>


More information about the users mailing list