Error in my function in my for loop

1 visualización (últimos 30 días)
Ongun Palaoglu
Ongun Palaoglu el 7 de Oct. de 2020
Comentada: Ongun Palaoglu el 12 de Oct. de 2020
Hello I am trying to make a function. I have for inputs datetime 3 of them one of them is logical. I am trying to calcutate a number from many rows. I have for loop, my max iteration is the height of my table. I have cases for logical data part of my function to decide the final output, I am unable to put the final answer in an order as output. I am getting an error with exceeding matrix dimensions.
function [Count SensoredData] = sensor(StartDate,EndDate,PatientinResearch,LogicalDeath)
% X is start of the research.
% Y end date of the Research.
% E is number of days patient stay in the research
% Z is if death is occured or not.
if ~isdatetime(StartDate)
error('MyComponent:incorrectType',...
'Error. \nInput must be a DateTime for StartDate, not a %s.',class(StartDate))
end
if ~isdatetime(EndDate)
error('MyComponent:incorrectType',...
'Error. \nInput must be a DateTime for EndDate, not a %s.',class(EndDate))
end
if ~isdatetime(PatientinResearch)
error('MyComponent:incorrectType',...
'Error. \nInput must be a DateTime for PatientinResearch, not a %s.',class(PatientinResearch))
end
if ~isa(LogicalDeath,'logical')
error('MyComponent:incorrectType',...
'Error. \nInput must be a Logical for LogicalDeath, not a %s.',class(LogicalDeath))
end
X = StartDate;
Y = EndDate;
E = PatientinResearch;
Z = LogicalDeath;
T = table();
% totalTimeOfResearch = caldays(between(X,Y,'days'));
%
% sdn1 = datenum( Y );
% sdn2 = datenum( E );
% format long
%
[n,m] = size(X);
for i = 1 : 1 : n
if caldays(between(X,Y,'days')) >= caldays(between(X,E,'days'))
switch Z
case 0
p = 0;
T(i,:) = [i p];
case 1
p = 1;
T(i,:) = [i p];
end
end
if caldays(between(X,Y,'days')) < caldays(between(X,E,'days'))
switch Z
case 0
p = 1;
T(i,:) = [i p];
case 1
p = 0;
T(i,:) = [i p];
end
end
end
Count = T(:,1);
SensoredData = T(:,2);
end

Respuesta aceptada

Jesús Zambrano
Jesús Zambrano el 7 de Oct. de 2020
Try to define the size of T before using it. Also, make sure that the line of code
[n,m] = size(X);
is giving you the value of n you expect.
  3 comentarios
Seth Furman
Seth Furman el 8 de Oct. de 2020
Editada: Seth Furman el 8 de Oct. de 2020
I'm not clear on the goal of this code, but here are a few common pitfalls I notice:
Access Data in Tables
  • Indexing into a table always requires 2 indices, so the line "T(i) = p;" will always fail. Instead you want "T(i,1) = p;".
  • When assigning a non-table into a table, use curly braces instead of smooth parentheses, for example "T{i,1} = p; % OK" instead of "T(i,1) = p; % ERRORS if p isn't a table".
Prefer Vectorization
  • Use vectorization where possible because it's typically faster and leads to shorter code.
  • One example where you can add vectorization in this case is by creating SensoredData at the end of your function, instead of inside the for-loop with a simple index into T, for example "SensoredData = T(:,1);"
Ongun Palaoglu
Ongun Palaoglu el 12 de Oct. de 2020
Somehow I solved it, probably it is due to missing date lines

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Dates and Time en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by