2
\$\begingroup\$

Below are two examples of arrays I have, with some given length:

enter image description here

For some value z, I want to find the column the value is in. MATLAB code I wrote:

if z == 1
   column = ceil(length/2);   
elseif logical(mod(z,2))
   column = length - (z-3)/2;
else
   column = z/2;
end

It is correct I think. But ugly and possibly slow. Is there a one-liner in MATLAB that can do this?

\$\endgroup\$
2
\$\begingroup\$

Let's call the array x:

x = 2 4 6 8 1 9 7 5 3

I'm assuming you don't have the array stored in a variable (in which case this question boils down do: find(x==z)), and that you don't need the array either (in which case this question is really: "How do I create x?").


First off:

Don't use length as a variable name. length is a builtin function, and overloading it is a bad idea. Although it's better to use the builtin numel instead of length, overloading length is not a good idea. It might cause all sorts of strange bugs. Choose another variable name (I'll use len, you might use something else).


x has a fairly straight forward setup, and can be created quite simply using concatenation and the colon operator.

x = [2:2:len, 1, fliplr(3:2:len)]

If you can guarantee that len is odd then it's simply:

x = [2:2:len, 1, len:-2:3]

Now, you have x, and you know z. The only thing remaining is a simple call to find:

col = find(x==z);
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.