nm

11643 Reputation

20 Badges

13 years, 144 days

MaplePrimes Activity


These are questions asked by nm

I am finding it a struggle to do this trivial task in Maple.

Given a matrix, I simply wanted to find the positions (index i,j) of all elements that meets some condition. For example, given matrix A:=[[1,2,3,],[4,5,-1]]; I want to find the index of all elements >=3, so the result should be a list of set such as

         [[1,3],[2,1],[2,2]] 

I tried to use member with 'pos' option but that does not work for matirx. It seems only designed for 1D

A:=Matrix( [ [1,2,3],[4,5,-1]] );
c:=select[flatten](x->x>=3,A);  #tried without flatten also
member(c,A,'pos');
pos;

Then I tried rtable_scanblock(), which is the most convoluted and badly documented command I have ever seen in my life (for such a complex command, one will expect 100 examples of many sorts of functionality to illustrate how to use, but only 3-4 trivial examples exist and 3 of them pretty much the same).  What is operation_passindex? what is operation_passnoindex? how to use them? Why is there a star next to val* and operation* ? What is passindex actually? is it a name? value? proc?  etc.. Worst help page ever. 11 parameters for a command??

This is what I tried:

A:=Matrix( [ [1,2,3],[4,5,-1]] ):
rtable_scanblock(A,[],(val,ind,res)->( evalb(val>=3),[ind,val],res),[[1,1],A[1,1]]);

So the result I want is there. I just do not understand why the true,false and those last entries are there and how to get rid of them. I tried. I think I need one other options, but I am lost with all the options listed there with no examples on how to use them.

rtable_scanblock(A,[],(val,ind,res)->`if`( val>=3,[ind,val],res),[[1,1],A[1,1]]);

but then I get only the last value:

I tried

rtable_scanblock(A,[],(val,ind,res)->`if`( evalb(val>=3),[ind,val],res),[[1,1],A[1,1]]);

no difference.  I think I am close, but after 30 minutes, I am calling it quit. If something so easy takes that much effort to find how to in Maple, then something is wrong.

In Matlab, I do this with my eyes closed:

A=[1,2,3;4,5,-1];
[I,J]=find(A>=3)

I =
     2
     2
     1
J =
     1
     2
     3

In Mathematica, such as trivial

mat = {{1, 2, 3}, {4, 5, -1}};
Position[mat, x_ /; x >= 3]

                 {{1, 3}, {2, 1}, {2, 2}}

Thank you

 

In Maple, I seem to keep finding commands in different Maple build-in packages that does the same thing. Which is very confusing for someone trying to learn Maple.

Maple seems to have good things in it, but at the same time, it strikes me as a large bag with lots of tools and commands thrown in with little sense of coherence. One needs one command from one package to finish the job started using a command from a different package, and an option from one place to patch something done with a command from another package.

Here is one example. I wanted to obtain the diagonal of a matrix. So far, I found 3 commands that do the same exact thing:

A:=Matrix([ [1,2,3],[4,5,6],[7,8,9]]);
MTM:-diag(A);  #1
LinearAlgebra:-Diagonal(A);  #2
Student:-LinearAlgebra:-Diagonal(A);  #3

I am sure if continue to look, I might find another command to do the same thing hiding in some other package.

The problem for new user like me, is how does one decide which comand to use. This is the same as with constructing a Matrix. There is the Matrix([[]]) notation and metod, and there is the <<>> notation that does the same thing but with different and conflicting syntax.

Having many commands that do duplicate things is not a good thing at all. Commands should be axiomatic and orthogonal to each others. I think there should be a document that describes from a high level all these packages, may be as a block diagram with arrows that show the relation, if any, between them, and how they interact and when to use one vs. the other.

Is there a reason for this duplication of functionality? Does any one at Maplesoft look at such issues?

 

I figured how to insert row in middle of a matrix using <<>> notation. But I am trying to stick to one notation which is the Matrix() and Vector() for now. 

Here is what I am trying to do. Insert a row in the third row of  Matrix. This works:

A:=< <1|2|3>,<4|5|6>,<7|8|9>>;
A:=<<A[1..2,..],<90|91|92>,A[3,..]>>;

But when I try

A:=Matrix([ [1,2,3],[4,5,6],[7,8,9]]);
A:=Matrix([ A[1..2,..], [91,92,92], A[3,..] ]);

Error, (in Matrix) this entry is too tall or too short: [91, 92, 92]

I also tried:
A:=Matrix([ A[1..2,..], Vector[row](91,92,92), A[3,..] ]);
A:=Matrix([ A[1..2,..],Matrix([[91,92,92]]), A[3,..] ]);

I am starting to think I should go back to using <<|,|,|>> notation, even thought I do not like it, but at least it seems more logical. 
How would you insert row in middle of matrix, using Matrix() constructor from an existing Matrix?

 

 

I am learning a bit of Maple. I noticed I can use map and seq to obtain the same result I want. So I was wondering when to use each, or if it just a style issue or if there is more to it.

I am sure there are cases when map can only be used, and cases when seq() only can be used. But are there general rules of thumb to look for when deciding which to use? Here is an example of what I mean

restart;
plot( map(i->i*sin(t),[seq(i,i=.1..1,.2)]),t=-2*Pi..2*Pi);   #1
plot( [seq(i*sin(t),i=.1..1,.2)],t=-2*Pi..2*Pi);  #2

Both give the same result

I kind'a like map more myself, but seq is a little shorter in this case. Just looking for thoughts and hints from the experts.

 

One would expect that hitting F3 will split from _end_ of the current line (where the cursor is at).

But what Maple does is actually split everything from the current cursor location. Which means if the cursor happened not to be exactly at the end of the line, the current line itself will also be split and broken.

It is much more logical to split starting from end of current _line_ (where the cursor is at), not current character, because that is what normally one would want to do. One will have large block of code, and want to split it from one line down to the end.  It is a simple usability issue, which Maple UI seems to suffer allot from.

Is there a way to modify this behavior? I keep hitting F3 and forget to move the cursor to the end of the line before, and end up wasting time having to fix things afterwords since the line itself is split.

 

 

First 192 193 194 195 196 197 198 Last Page 194 of 205