## Functional form of the colon (:) operator?

Knut

### Knut (view profile)

님이 질문을 제출함. 18 Sep 2012
최근 활동 Royi Avital

### Royi Avital (view profile)

님이 댓글을 추가함. 15 Jan 2019
José-Luis

### José-Luis (view profile)

님이 답변을 채택함.
This is a post about "how to write neat, efficient, readable MATLAB code". I get the job done by doing work-arounds, but I would rather not do those.
Assume that a, b are two vectors of unknown orientation, and we want to compute something similar to the dot-product.
It might look something like this:
function y = myfunc(a,b)
//make sure that vectors are oriented the same way
y = a(:) .* b(:);
But what if I need to calculate y for elements 2:N? We might do something like this, but I think it clutters the code:
function y = myfunc(a,b)
a = a(2:end)
b = b(2:end)
y = a(:) .* b(:);
I am wishing for a functional form of the colon operator that might look something like this:
function y = myfunc(a,b)
y = colon(a(2:end)) .* colon(b(2:end));

로그인 to comment.

## 답변 수: 4

José-Luis

### José-Luis (view profile)

님의 답변 18 Sep 2012
채택된 답변

function y = myfunc(a,b)
//make sure that vectors are oriented the same way
y = reshape(a(2:end),[],1) .* reshape(b(2:end),[],1);

Jan

### Jan (view profile)

10 Oct 2017
Nice, short, efficient: I have accepted this answer.

로그인 to comment.

Daniel Shub

### Daniel Shub (view profile)

님의 답변 18 Sep 2012

I thought that squeeze would do what you want, but apparently it doesn't "work" on row vectors. What would be nice is if squeeze had a row flag. Barring that, you can easily create your own colon function. From
type squeeze
it should be obvious what you need to change.

로그인 to comment.

Royi Avital

### Royi Avital (view profile)

님의 답변 10 Oct 2017

I really wish MATLAB would add function to vectorize arrays into column vector as the colon operator does.

Steven Lord

### Steven Lord (view profile)

10 Oct 2017
We did, a very long time ago. It's called reshape.
A = magic(5);
B = reshape(A, [], 1);
% or to avoid the need to implicitly compute the "missing" size
% inside reshape
C = reshape(A, numel(A), 1);
Jan

### Jan (view profile)

10 Oct 2017
@Royi: Do you have an example where the mentioned methods are not applicable or "ugly"?
Royi Avital

### Royi Avital (view profile)

15 Jan 2019
@Jan, I find something like vec(A) to be much more elegant.

로그인 to comment.

Jan

### Jan (view profile)

님의 답변 10 Oct 2017

What's wrong with:
y = x(:)
or:
reshape(x, [], 1)
There is a functional form of the x(:) operator:
subsref(x, struct('type', '()', 'subs', {{':'}}))

Walter Roberson

### Walter Roberson (view profile)

17 Oct 2018
Sometimes it is easiest to define an auxillary function, such as
column = @(M) M(:);
after which you can
column(a(2:end)) .* column(b(2:end))

로그인 to comment.

Translated by