How can I identify value of an array?

Hi! I'm creating a code with Matlab but I've a problem.
I have an array, that is:
  
C = [2,1,0];
I've identified position of values, like:
  
C1 = C (1)
C2 = C (2)
C3 = C (3)
but I'd like to insert an input, that asks to user to insert the different values of array, so I can not know how many values will be in array.
In this case, how can I identify the position of single elements, given an input with a generic number of elements?
I thought to create a 'for cycle' but I have many problems!
Thank you

7 Comments

you can use size(C,2) to check how many entries each row of your matrix has.
If you want to find the index of a certain value you can use find.
I want to suggest that you do not name your variables C1, C2, C3 and instead use their indexes: C(1), C(2), C(3).
Simple rule: If you're numbering variables, you're doing it wrong. Follow Dennis' link to learn more.
I'm really not clear what your problem is. Maybe explain what you want to do afterward. Why would you even need C1, C2, etc.?
I'd like to create a code that, given an input with values in array, identifies position of all values in array. The code will be able to generate automatically position of these values. If I don't know which are the variable, how can I do?
I have no idea on what you are wanting to do. Could you plz give a more detailed example and show your operation flow?
given an input with values in array, identifies position of all values in array
What does that actually mean? What is a position? What are you going to do with these positions?
You're not telling us the big picture. That would really help because at the moment your question is very strange.
So, I'm creating a code to read and process the dicoms. The code that I created runs and doesn't give problems, but I'd like to change different things according to preferences of user.
For example, I've an array with different values (9 values, expressed with numbers: 0,15,50,100,200,350,500,700,1000) that rapresent the different magnetic fields (in order, 9,1,2,3,4,5,6,7,8).
First, I associated one value to another.
For example: if input is [1000 700 500 350 200 100 50 15 0] I associate these value to their magnetic fields, that in order are [8,7,6,5,4,3,2,1,9].
Now, this runs only if user insert 9 values of input.
I'd like that it runs also with other values, always insert by user, for example 10 values. To do this I'd like to change this passage.
This is a part of code that I want to change:
b = 9;
num_int = numel(files)/b;
for k = 1 : num_int
Ck = [];
for n = 1:b
C_end = C(:,:,K+num_int*(n-1));
Ck = cat(3,Ck,C_end);
end
C_input = [1000,700,500,350,200,100,50,15,0]
C_input_2 = sort(C_input(C_input>0))
Cb0 = C_input(9)
Cb1 = C_input(1)
Cb2 = C_input(2)
Cb3 = C_input(3)
Cb4 = C_input(4)
Cb5 = C_input(5)
Cb6 = C_input(6)
Cb7 = C_input(7)
Cb8 = C_input(8)
Cb0_new = find(C_input == Cb0)
Cb1_new = find(C_input_2 == Cb1)
Cb2_new = find(C_input_2 == Cb2)
Cb3_new = find(C_input_2 == Cb3)
Cb4_new = find(C_input_2 == Cb4)
Cb5_new = find(C_input_2 == Cb5)
Cb6_new = find(C_input_2 == Cb6)
Cb7_new = find(C_input_2 == Cb7)
Cb8_new = find(C_input_2 == Cb8)
C_b0 = Ck(:,:,Cb0_new);
C_b1 = Ck(:,:,Cb1_new);
C_b2 = Ck(:,:,Cb2_new);
C_b3 = Ck(:,:,Cb3_new);
C_b4 = Ck(:,:,Cb4_new);
C_b5 = Ck(:,:,Cb5_new);
C_b6 = Ck(:,:,Cb6_new);
C_b7 = Ck(:,:,Cb7_new);
C_b8 = Ck(:,:,Cb8_new);
Ck = cat(3,C_b0,Ck);
Ck(:,:,10) = [];
eval(['C',num2str(k),'=Ck'])
end
Stephen23
Stephen23 on 2 May 2018
Edited: Stephen23 on 7 May 2018
@sc: why do you need to do this? Using indexing is simple and very efficient. What you are trying to do is slow, complex, buggy, and hard to debug. Experienced MATLAB users use indexing: you can too.
EDIT: see also later question, where the OP asks about what they are actually trying to achieve:

Sign in to comment.

 Accepted Answer

Maybe you want something like this:
C = [2,1,0];
index = find(C == 1);
Or
[match, index] = ismember([1,2], C);

1 Comment

I've already done it and the code works; now, I'd like that C is an input with different values and I'd like to create a cycle to find position of each elements in array, but I don't know how to do it because I don't know how many variables the user have put in array, so I'd like to change this function, as like the code will generate it automatically.

Sign in to comment.

More Answers (1)

Guillaume
Guillaume on 30 Apr 2018
Edited: Guillaume on 30 Apr 2018
Please, do read the discussion on the link in Dennis' comment. The code you've written is exactly why we say not to number variables and use eval. It's pointless complicated.
Before that,
b = 9;
num_int = numel(files)/b;
for k = 1 : num_int
Ck = [];
for n = 1:b
C_end = C(:,:,K+num_int*(n-1));
Ck = cat(3,Ck,C_end);
end
I'm not entirely sure what you're doing here since K is not defined. Assuming that there is a typo and K is k then all you're doing is deinterlacing data. In which case:
b = 9;
assert(mod(numel(files), b) == 0, 'Number of files must be a multiple of b'); %always a good idea to check your assumptions
num_int = numel(files) / b;
Ck = C(:, :, (1:num_int) + (0:b-1)' * num_int); %requires R2016b
%Ck = C(:, :, bsxfun(@plus, 1:num_int, (0:b-1)' * num_int)); %on earlier versions
This will be much faster than your double loop and your growing Ck array.
Then the whole numbered Cbxx, CBxx_new, etc. is completely pointless. If all you want to do is reorder things, then use indexing:
C_input = [1000,700,500,350,200,100,50,15,0];
order = [9 1 2 3 4 5 6 7 8 9];
new_cb = C_input(order);
C = Ck(:, :, order);
or something like that. Again, I'm really not clear on what you're trying to do. One thing for sure, you do not need numbered variables and eval.

3 Comments

I understand what you mean, but there is the same problem.
Now the code processes only 9 magnetic fields and with these functions it runs, but probably in the future will be other magnetic fields to insert, so, consequency, there will be other variables in array 'order', that must be generate automatically with input of user (that is in this case C_input).
How can I modify this?
I'm afraid I don't really understand what exactly changes with user input and what you want to do with it. An array does not contain variables. Can you describe a bit better what's supposed to change and what calculation should be done as a result.
One thing for sure, even if the size of an array is not fixed, indexing is going to be the solution.
sc
sc on 7 May 2018
Edited: sc on 7 May 2018
I tried to modify code:
C_input = [8,7,6,5,4,3,2,1,9];
for n = C_input
C_end = C(:,:,k+num_int*(n-1));
Ck = cat(3,Ck,C_end);
end
Now, I'd like that C_input is [1000,700,500,350,200,100,50,15,0] and the code converts this into [8,7,6,5,4,3,2,1,9], that is order position of values (except 0). How can I do?

Sign in to comment.

Categories

Asked:

sc
on 30 Apr 2018

Reopened:

on 11 May 2018

Community Treasure Hunt

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

Start Hunting!