Index exceeds the number of array elements (1)

%When I try to perform a row interchange for 'b' vector It tells me it exceeds the no of array elements. This is an attempt to perform partial pivoting for matrix A and vector b separately.
Thanks
A = [1 2 3;4 2 -1; 3 2 3];
b = [1; 3; 2];
k = 1;
A = pivoting(A,k)
function [A, b, flag] = pivoting(A, b, k)
n = size(A,1);
flag = 0;
for k=1:n-1
[big, i]=max(abs(A(k:n,k)))
ipr=i+k-1
if ipr~=k
A([k,ipr],:)=A([ipr,k],:)
b([k,ipr])=b([ipr,k])
end
end
end

 Accepted Answer

It's because you're trying to manipulate b in line,
b([k,ipr])=b([ipr,k])
but, you're inputting as follows.
k = 1;
A = pivoting(A,k)
so, in function pivoting, b (second input variable) is scalar (1).
You just need to input three variables.
% A = pivoting(A,k)
A = pivoting(A,b,k)

9 Comments

That worked for me but, Is there another way to solve this program successfully without changing the pivoting function and only the code in the for loop?
Thanks for the help Kojiro!
It didn't mean changing pivoting function. You're calling pivoting with two inputs (A and k),
A = [1 2 3;4 2 -1; 3 2 3];
b = [1; 3; 2];
k = 1;
A = pivoting(A,k)
but I suggested that you would call pivoting with three inputs (A, b and k)
A = [1 2 3;4 2 -1; 3 2 3];
b = [1; 3; 2];
k = 1;
A = pivoting(A,b,k)
Sorry what I meant was is it possible to do it with only calling pivoting with two inputs (A and k)?
I see. Actually, k is initialized in pivoting function, so you don't need to input it.
The following would work.
A = [1 2 3;4 2 -1; 3 2 3];
b = [1; 3; 2];
%k = 1;
A = pivoting(A)
function [A, flag] = pivoting(A)
n = size(A,1);
flag = 0;
for k=1:n-1
[big, i]=max(abs(A(k:n,k)))
ipr=i+k-1
if ipr~=k
A([k,ipr],:)=A([ipr,k],:)
%b([k,ipr])=b([ipr,k])
end
end
end
Sorry sorry, I mean only by changing this code:
for k=1:n-1
[big, i]=max(abs(A(k:n,k)))
ipr=i+k-1
if ipr~=k
A([k,ipr],:)=A([ipr,k],:)
b([k,ipr])=b([ipr,k])
end
end
end
Thanks, don't mean to annoy you, I'm trying to learn how to change the source code without changing the pivoting function.
The following is what you want to do?
A = [1 2 3;4 2 -1; 3 2 3];
b = [1; 3; 2];
%k = 1;
n = size(A,1);
for k=1:n-1
[big, i]=max(abs(A(k:n,k )))
ipr=i+k-1
if ipr~=k
A([k,ipr],:)=A([ipr,k ],:)
b([k,ipr])=b([ipr,k ])
end
end
Yeah, including this code with only changing from the bold text code.
A = [1 2 3;4 2 -1; 3 2 3];
b = [1; 3; 2];
k = 1;
A = pivoting(A,k)
function [A, b, flag] = pivoting(A, b, k)
n = size(A,1);
flag = 0;
for k=1:n-1 %Here
[big, i]=max(abs(A(k:n,k)))
ipr=i+k-1
if ipr~=k
A([k,ipr],:)=A([ipr,k],:)
b([k,ipr])=b([ipr,k])
end
end
end %End
Thanks, Kojiro
It's not possible only changing the bold text code because the funtion pivoting requires three inputs, so you need to modify input variables so that it allows two inputs.
Alright that makes sense,
Thanks for the help Kojiro!

Sign in to comment.

More Answers (0)

Products

Release

R2020a

Community Treasure Hunt

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

Start Hunting!