Changing the size of an array in a while loop

조회 수: 17 (최근 30일)
Chris B
Chris B 2020년 10월 14일
답변: Sindar 2020년 10월 15일
I am trying to interpret a series of data iteratively, but am having a problem with my arrays not being the same size (Error: Matrix dimensions must agree).
The problem is, I have a series of data points that are calculated and I must then take the derivative of that data set and compare the derivative to the original data set, and do this multiple times until the difference is within a convergence factor.
For example: say I have an initial data set A_o, which is a 1000x1 matrix. I then take the derivative of A_o (which I have called A_i), which returns a 999x1 matrix. I then need to compare the difference between A_o and A_i to see if they are within a set convergence factor, and if not, re-run the calculation with A_i now taking the place of A_o and A_i+1 being the derivative of A_i. So A_i+1 will be a 998x1 matrix, and so on. I have chosen to set this up using a while loop.
Everytime I take the derivative, it makes the arrays a different size and thus the code will not run. I also have to multiply this by another data set (I have called 'I') as well. Essentially, I don't know how to systematically reduce the size of my array by 1 point each time it goes through the loop.
Any help would be greatly appreciated. I have attatched the problematic part of the code below.
% A_0 is my inital array of data, calulated and brought in from another function.
% I is another array of data with the same number of data points as A_0
dt = 0.2 % A set time interval between datapoints
A_i = (diff(A_0)/dt).*I.^2; %My equation to get to the next iteration using the derivative of A_0
conv_con = A_0 - A_i;
while conv_con > 1e-9
A_0 = A_0 + A_i;
A_i = (diff(A_0)/dt).*I.^2;
end

채택된 답변

Sindar
Sindar 2020년 10월 15일
keeps the vector the same length
A_i = gradient(A_0,dt).*I.^2;
changes size of vector (and uses a for loop since there are a known number of possible iterations)
% A_0 is my inital array of data, calulated and brought in from another function.
% I is another array of data with the same number of data points as A_0
dt = 0.2 % A set time interval between datapoints
A_i = (diff(A_0)/dt).*I.^2; %My equation to get to the next iteration using the derivative of A_0
for ind=1:length(A_0)
% "re-run the calculation with A_i now taking the place of A_o"
A_0 = A_i;
% something else
%A_0 = A_0(1:end-1) + A_i;
A_i = (diff(A_0)/dt).*I(1:end-ind).^2;
if all((A_0 - A_i)<1e-9)
break
end
end
if ind==length(A_0) && all((A_0 - A_i)<1e-9)
warning('Not converged')
end

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Function Creation에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by