MATLAB one-liners

조회 수: 8 (최근 30일)
Andrew Newell
Andrew Newell 2011년 3월 3일
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?

채택된 답변

Walter Roberson
Walter Roberson 2011년 3월 3일
cell2mat(arrayfun(@(K) accumarray(C, F(:,K), [], @mean), 1:size(F,2), 'Uniform', 0))
In response to a cssm question:
I have a feature matrix, F(m, n) and a cluster vector, C(m, 1).
Now I want to get the mean of feature in F according to C. Make
it simple as below:
F = [2 5; 3 7; 8 4]
C = [2; 1; 2]
output should be [3 7; (2+8)/2 (5+4)/2]
=[3 7; 5 4.5]
  댓글 수: 2
Matt Fig
Matt Fig 2011년 3월 3일
ARRAYFUN, and ACUMARRAY? About all that is missing is to somehow work BSXFUN in there too!
Andrew Newell
Andrew Newell 2011년 3월 28일
Even though BSXFUN is missing, I decided to accept this one. Very clever, @Walter!

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

추가 답변 (9개)

Matt Tearle
Matt Tearle 2011년 3월 3일
I'm a huge fan of logical indexing. Expressions like
mean(frogs(wombats > 42))
rock my world.
  댓글 수: 3
Sean de Wolski
Sean de Wolski 2011년 3월 3일
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
Andrew Newell 2011년 3월 3일
I like it!

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


Sean de Wolski
Sean de Wolski 2011년 3월 3일
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
Sean de Wolski
Sean de Wolski 2011년 3월 3일
idx can usually be a one line expression from cellfun making this a super-awesome-long-one-liner.

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


Matt Fig
Matt Fig 2011년 3월 3일
Here is a good one. After already writing a solution to this Question, I stumbled upon this:
groups = mat2cell(A,diff([0;find(diff(A) ~= 1);length(A)]),1);
Pretty Slick.
  댓글 수: 6
Matt Tearle
Matt Tearle 2011년 3월 3일
Matt Fig: "LI is tops, but not always necessary or useful"
An unbeliever! Persecute! Kill the heretic!
Walter Roberson
Walter Roberson 2011년 3월 3일
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
Matt Tearle 2011년 3월 3일
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
Andrew Newell
Andrew Newell 2011년 3월 3일
I like compact expressions with social commentary.

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


Andrew Newell
Andrew Newell 2011년 3월 3일
Turn a structure array S into a cell array with the names of the fields in the first column:
C = horzcat(fieldnames(S), squeeze(struct2cell(S)))

Andrew Newell
Andrew Newell 2011년 3월 6일
Here is a real beauty from a comment by Tim Davis on a guest blog for Loren Shure. Suppose you have three 2D vectors p1, p2 and p3, and you want to know if they are collinear. The shortest solution also happens to be numerically the most reliable:
rank ([p2-p1 ; p3-p1]) < 2
It is also easily generalized to more dimensions!

Oleg Komarov
Oleg Komarov 2011년 3월 3일
eval('fliplr(['''' 33 33 33 33 33 76 105 118 69 32 109 39 73 ''''])')
MuAhahauHAh!!!
  댓글 수: 3
Oleg Komarov
Oleg Komarov 2011년 3월 3일
You're the evilest!
the cyclist
the cyclist 2011년 3월 28일
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
Andrew Newell 2011년 3월 4일
Here is an interesting way of calculating n rows of Pascal's triangle:
round(expm(diag(1:n-1,-1)))
Now if we could just remove the zeros and center it on the same line!
  댓글 수: 3
Doug Eastman
Doug Eastman 2011년 3월 29일
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
Andrew Newell 2011년 3월 29일
Wow! Three nested cellfuns! This deserves a separate answer.

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


Drew Weymouth
Drew Weymouth 2011년 3월 4일
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
Walter Roberson
Walter Roberson 2011년 3월 4일
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.

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

카테고리

Help CenterFile Exchange에서 Programming에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by