How to quickly index the first cell of sets of the array with near similar names?

1 Ansicht (letzte 30 Tage)
Hey all, Here is my workspace:
I want to know if there is any way to index the first cell of each P_ arrays based on (Jan, Feb, Mar,..., Dec, Win, Spr, Sum, Aut, Annual)
For example in this picture I want :
8, 12, 5, 8, 9, 8 , 7, 5, 5, 6, 6, 7, 7, 5, 2, 3, 8
(January to annual)
Thank you all
  1 Kommentar
Stephen23
Stephen23 am 21 Apr. 2020
Bearbeitet: Stephen23 am 21 Apr. 2020
Bad data design forces you to write slow, complex, obfuscated, buggy code which is hard to debug:
Your code would be simpler and more efficient if you just used a structure, e.g.:
S.Jan = [...]
S.Feb = [...]
...
S.Dec = [...]
Then you could use dynamic fieldnames to access any of the arrays:
fld = 'Jan';
S.(fld)
Or use a table, which would be similarly simple and efficient to access:
Note that you should fix your badly-designed data at the point where those separate arrays are generated in the workspace, e.g. by load-ing into an output variable (which is a scalar structure) instead of directly into the workspace:
S = load(...)

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Mehmed Saad
Mehmed Saad am 21 Apr. 2020
Bearbeitet: Mehmed Saad am 21 Apr. 2020
You can do that using eval but it is not efficient to use eval in your code frequently
mn={'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Win','Spr','Sum','Aut','Anuual'};
x = zeros(1,length(mn));
for i=1:length(mn)
x(i) = eval(['P_' mn{i} '(1)']);
end

Weitere Antworten (2)

Rik
Rik am 21 Apr. 2020
This is bad code design. You should have made these variables fields of single struct. This has forced you to write slow buggy code where you are forced to either write a lot of repetitive code by hand, or use eval. You should change how this data was generated.
Once it is a struct you can use the code below.
fn=fieldnames(P);
output=zeros(size(fn))
for n=1:numel(fn)
tmp=P.(fn{n});
output(n)=tmp(1);
end

KSSV
KSSV am 21 Apr. 2020
YOu can get the variable names into a cell and use strcmp to check the variable.
S = whos ;
v = {S.name} ;
idx = strfind(v,'P_Jan') ;
  2 Kommentare
BN
BN am 21 Apr. 2020
Well, Thank you but I'm sorry, I want an entirely different thing. I wanted to index the first value of each array.
KSSV
KSSV am 21 Apr. 2020
Use logical indexing......
idx = find(myarray == num) ;

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange

Tags

Produkte


Version

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by