MATLAB one-liners
Mostrar comentarios más antiguos
One of the joys of using MATLAB is that it has a stock of matrix functions like diff, sort, all, and so on, that can be combined in all sorts of interesting ways. For example, in a recent question, the challenge was to find a compact code to determine which columns of a matrix A have all elements equal. Matt Tearle came up with this nifty answer:
all(~diff(A))
What are your favorite one-line MATLAB expressions?
Respuesta aceptada
Más respuestas (9)
Matt Tearle
el 3 de Mzo. de 2011
I'm a huge fan of logical indexing. Expressions like
mean(frogs(wombats > 42))
rock my world.
3 comentarios
Andrew Newell
el 3 de Mzo. de 2011
Sean de Wolski
el 3 de Mzo. de 2011
I use the function 'keep' from the FEX which performs the inverse of clear.
I also use the variables 'in', 'out' a lot. So the other day I typed:
'keep out'
which kind of made my day.
Andrew Newell
el 3 de Mzo. de 2011
Sean de Wolski
el 3 de Mzo. de 2011
Here's another from a thread today:
Given a connected components analysis (bwconncomp) and some criteria for objects to meet: remove objects that don't meet that criteria from your binary image:
I(cell2mat(CC.PixelIdxList(~idx)')) = false;
1 comentario
Sean de Wolski
el 3 de Mzo. de 2011
idx can usually be a one line expression from cellfun making this a super-awesome-long-one-liner.
Matt Fig
el 3 de Mzo. de 2011
groups = mat2cell(A,diff([0;find(diff(A) ~= 1);length(A)]),1);
Pretty Slick.
6 comentarios
Andrew Newell
el 3 de Mzo. de 2011
Matt Fig
el 3 de Mzo. de 2011
LOL, LI is tops, but not always necessary or useful.
Walter Roberson
el 3 de Mzo. de 2011
Strange, I am sure I wrote code much like that in response to one of the numerous copies of that question. I cannot seem to find it now, though. I had the 1 first, and I used > instead of ~=
Matt Fig
el 3 de Mzo. de 2011
I had it stored in my "One liners" file, which is made up of one-liners either I or somebody else on CSSM wrote in response to some question. The file is too big to be much use anymore...
Matt Tearle
el 3 de Mzo. de 2011
Matt Fig: "LI is tops, but not always necessary or useful"
An unbeliever! Persecute! Kill the heretic!
Walter Roberson
el 3 de Mzo. de 2011
Ah, I found my copy, and it was _not_ a 1 liner. I had used
b=diff(a); %find differences
idx = find([b 2]>1); %find their indexes
cel = mat2cell(a, 1, [idx(1) diff(idx)]); %break up the matrix
Matt Tearle
el 3 de Mzo. de 2011
Inspired by something I'm working on right now & your comment to my previous answer...
If you have an n-by-1 structure array people with a field suck (which contains a scalar for each struct element), and you want to find the average:
mean([people.suck])
Extract multiple elements, concatenate, apply function. All in one line.
1 comentario
Andrew Newell
el 3 de Mzo. de 2011
Andrew Newell
el 3 de Mzo. de 2011
Andrew Newell
el 6 de Mzo. de 2011
Oleg Komarov
el 3 de Mzo. de 2011
eval('fliplr(['''' 33 33 33 33 33 76 105 118 69 32 109 39 73 ''''])')
MuAhahauHAh!!!
3 comentarios
Andrew Newell
el 3 de Mzo. de 2011
Oleg Komarov
el 3 de Mzo. de 2011
You're the evilest!
the cyclist
el 28 de Mzo. de 2011
I used to be an admin on a chess server where "qu" could be used as a shorthand to quit out of the interface. A common prank was to tell newbies that "qu" could be used to display the "quote of the day".
Andrew Newell
el 4 de Mzo. de 2011
3 comentarios
Walter Roberson
el 4 de Mzo. de 2011
sprintf() it and regexrep() on the result, substituting spaces for leading space-zero-space; another regexprep() call could substitute spaces for trailing space-zero-space.
Doug Eastman
el 29 de Mzo. de 2011
It's not pretty but just for fun, here's one way to do it:
trimmedTriangle = cell2mat(cellfun(@(x) x(1:size(num2str(expm(diag(1:n-1,-1))),2)),cellfun(@(x,y)[x y],cellfun(@(x) repmat(' ',1,x),num2cell(round(linspace(size(num2str(expm(diag(1:n-1,-1))),2)/2,0,n))'),'UniformOutput',false),regexprep(mat2cell(num2str(expm(diag(1:n-1,-1))),ones(n,1)),' 0',' '),'UniformOutput',false),'UniformOutput',false))
Andrew Newell
el 29 de Mzo. de 2011
Drew Weymouth
el 4 de Mzo. de 2011
0 votos
Read in an image and convert it to a grayscale, double matrix of data range 0..1
im= rgb2gray(double(imread('filename.jpg'))/255);
1 comentario
Walter Roberson
el 4 de Mzo. de 2011
or more generally, rgb2gray(im2double(imread('filename.jpg')))
Your code would fail for images that happened to be already double or happened to be uint16.
Categorías
Más información sobre Matrix Indexing en Centro de ayuda y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!