MATLAB one-liners
9 次查看(过去 30 天)
显示 更早的评论
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?
0 个评论
采纳的回答
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
2011-3-3
ARRAYFUN, and ACUMARRAY? About all that is missing is to somehow work BSXFUN in there too!
更多回答(9 个)
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
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.
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
2011-3-3
idx can usually be a one line expression from cellfun making this a super-awesome-long-one-liner.
Matt Fig
2011-3-3
groups = mat2cell(A,diff([0;find(diff(A) ~= 1);length(A)]),1);
Pretty Slick.
6 个评论
Matt Tearle
2011-3-3
Matt Fig: "LI is tops, but not always necessary or useful"
An unbeliever! Persecute! Kill the heretic!
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
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.
Oleg Komarov
2011-3-3
eval('fliplr(['''' 33 33 33 33 33 76 105 118 69 32 109 39 73 ''''])')
MuAhahauHAh!!!
3 个评论
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
2011-3-4
3 个评论
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))
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
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.
另请参阅
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!