for loop store values?

1 次查看(过去 30 天)
so I am convinced there is a better way for me to approach the following code:
ftse = xlsread('ftse123.xlsx');
L = length(ftse);
s = floor(L/10);
f25 = ftse(:,3);
k=1;
h=1;
for i = 1:10
j=s*i;
h=s*(i-1);
if h== 0
h=1;
else
h=s*(i-1);
end
y{i} = f25(h:j,:);
end
x1=cell2mat(y(1));
x2=cell2mat(y(2));
x3=cell2mat(y(3));
x4=cell2mat(y(4));
x5=cell2mat(y(5));
x6=cell2mat(y(6));
x7=cell2mat(y(7));
x8=cell2mat(y(8));
x9=cell2mat(y(9));
x10=cell2mat(y(10));
I used copy and paste after struggling to save the values x1 etc, within the for loop.
Also noticed that x1 is has a length of 522 and not 523 like the rest?
The code achieves what I want/need but must be long and drawn out.
any advice would be great thanks.
  2 个评论
Stephen23
Stephen23 2018-8-1
编辑:Stephen23 2018-8-1
"I used copy and paste after struggling to save the values x1 etc, within the for loop."
Copy-and-pasting code is a sign that you are doing something wrong. Using numbered variables is a sign that you are doing something wrong. The solution to both of these: use indexing.
Please upload ftse123.xlsx so that we have something to work with.
Phil Whitfield
Phil Whitfield 2018-8-1
that's when I posted after I started copy and pasting because I knew it was wrong.

请先登录,再进行评论。

采纳的回答

Stephen23
Stephen23 2018-8-1
编辑:Stephen23 2018-8-1
I would recommend that you use readtable or importdata and use a table to store, group, and process your data. In lieu of that, here is some simple code to group the third column into ten groups:
>> N = size(ftse,1);
>> V = linspace(1,11,N+1);
>> V = fix(V(1:end-1));
>> C = accumarray(V(:),ftse(:,3),[],@(v){v});
It is much simpler and more efficient to access the cells of C using indexing. Do NOT create numbered variables.
"Also noticed that x1 is has a length of 522 and not 523 like the rest?"
Because ftse has 5225 rows. There is no way to split this into ten equally sized groups:
>> size(ftse)
ans =
5225 4
>> size(ftse,1)/10
ans =
522.5
Half the groups will have 252, half have 253 elements. My code spreads these evenly through C:
>> cellfun('size',C,1)
ans =
523
522
523
522
523
522
523
522
523
522
  2 个评论
Phil Whitfield
Phil Whitfield 2018-8-1
编辑:Phil Whitfield 2018-8-1
Thanks, is there a way to create a 523x7 and 523x3 matrix of C from the index?
normally I would do :
xx=[x1,x2,x3,x4,x5,x6,x7];
xxx=[x8,x9,x10];
also I appreciate the 522 thing, should've seen that thanks.
Stephen23
Stephen23 2018-8-1
编辑:Stephen23 2018-8-1
"Thanks, is there a way to create a 523x7 and 523x3 matrix of C from the index?"
Not easily, because that does not match how many of each size data group that you actually have: five of each. So you could easily get 522x5 and 523x5 matrices:
M523 = [C{1:2:end}]
M522 = [C{2:2:end}]

请先登录,再进行评论。

更多回答(1 个)

Ashraf Rayed
Ashraf Rayed 2020-5-12
i have this code, i have to check the leaf area of some pictures in a folder and then i have save the area of those leaves by sequence in an excel sheet. Can you please help to sort out the problem?
D = 'F:\MATLAB\R2018a\bin\rayed mat lab\experimental';
S = dir(fullfile(D,'*.jpg'));
for k = 1:numel(S)
F = fullfile(D,S(k).name);
I = imread(F);
ih=rgb2hsv(I);
ih1=ih(:,:,1);
binary=ih1>0.6;
leafArea = sum(binary(:))
subplot(2, 2, 2);
imshow(binary, []);
message = sprintf('The leaf area = %d pixels.\n pixels = %.1f%%',...
leafArea, defectArea/leafArea*100);
uiwait(msgbox(message))
end

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

产品


版本

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by