Error "Index in position 2 is invalid."

%Heres the code I am working with.
gmat=zeros(118,400);
fid1=fopen('tomo_data.txt','r');
gdata= fscanf(fid1,'%f %f %f',[3,1600]);
for i=1:1600
gmat(gdata(1,i),gdata(2,i)) = gdata(2,i);
end
Index in position 2 is invalid. Array indices must be positive integers or logical values.
Heres the error:
Index in position 2 is invalid. Array indices must be positive integers or logical values.
Error in ch5q2b (line 16)
gmat(gdata(1,i),gdata(2,i)) = gdata(2,i);
Attached to this question is the txt file used. Any help would be appriciated.

2 件のコメント

Guilherme
Guilherme 2022 年 10 月 21 日
What's your final goal with yoour code? The problem you're facing is that your file has multiple floating points and this is probably what is causing the error of "index in position x is invalid".
The following code is, for instance invalid and has the exact same error as yours:
a = zeros(5,5);
a(1,0.5)
Index in position 2 is invalid. Array indices must be positive integers or logical values.
Also, you're creating all your code (vector and for) with predetermined values. This may not be a good practice if your input text change in the future. Instead you could go with something like:
fid1=fopen('tomo_data.txt','r');
gdata= fscanf(fid1,'%f %f %f',[3,1600]);
gmat = zeros(size(gdata));
Therefore, it'd be better if we could try to really understand what you're trying to do :D
Jacob Allen
Jacob Allen 2022 年 10 月 21 日
% Formulating the model matrix (a column vector) with m rows
mmat=zeros(400,1); %initialize with zeros
for i=14:16
for j=12:13
k = 20*(i-1) + j; % convert row and column description into the
% column vector element
mmat(k)=-0.1;
end
end
% Multiplying G matrix with the M matrix to produce synthetic data
% This will be our data matrix d (another column vector)
dmat=gmat*mmat;
% use lsqr to do inversion: use the above synthetic data dmat to
% recover the model. Need G matrix again.
minvert = lsqr(gmat,dmat);
% Finally, plot the staring model and recovered (by inversion) model
% need to put one-column model vector into original 20 by 20 grid first.
mmatgrid = reshape(mmat,[20,20]);
minvertgrid = reshape(minvert,[20,20]);
subplot(1,2,1) % using subplot to plot multiple panels in one figure
imagesc(mmatgrid,[-0.1 0.05]); colormap(gray);
title('The starting model');
colorbar('SouthOutside');
axis equal
xlim([0,20]);
ylim([0, 20]);
subplot(1,2,2)
imagesc(minvertgrid,[-0.1 0.1]); colormap(gray);
title('The recovered model by inversion');
colorbar('SouthOutside');
axis equal
xlim([0,20]);
ylim([0, 20]);
Here is what I have below that code I provided previously. I tried to explain what I am doing in the green text.

サインインしてコメントする。

回答 (1 件)

Cris LaPierre
Cris LaPierre 2022 年 10 月 21 日

0 投票

The error is because your second index, the column index for gmat, which is gdata(2,i), is 0. That is not a valid index. Indices in MATLAB must be positive integers (or logicals).
gmat = 1:3;
% works
gmat(1,1)
ans = 1
% your error
gmat(1,0)
Index in position 2 is invalid. Array indices must be positive integers or logical values.

6 件のコメント

Jacob Allen
Jacob Allen 2022 年 10 月 21 日
so how would I change my code above to relfect those changes?
Cris LaPierre
Cris LaPierre 2022 年 10 月 21 日
編集済み: Cris LaPierre 2022 年 10 月 21 日
You haven't explained what you are trying to achieve, so that would be hard to say.
You need to change how you are assigning values into gmat so that the index values are never 0, negative, or decimal values. The code assumes the values of gdata are all valid indices, but many are not.
gmat(gdata(1,i),gdata(2,i))
Jacob Allen
Jacob Allen 2022 年 10 月 21 日
% Formulating the model matrix (a column vector) with m rows
mmat=zeros(400,1); %initialize with zeros
for i=14:16
for j=12:13
k = 20*(i-1) + j; % convert row and column description into the
% column vector element
mmat(k)=-0.1;
end
end
% Multiplying G matrix with the M matrix to produce synthetic data
% This will be our data matrix d (another column vector)
dmat=gmat*mmat;
% use lsqr to do inversion: use the above synthetic data dmat to
% recover the model. Need G matrix again.
minvert = lsqr(gmat,dmat);
% Finally, plot the staring model and recovered (by inversion) model
% need to put one-column model vector into original 20 by 20 grid first.
mmatgrid = reshape(mmat,[20,20]);
minvertgrid = reshape(minvert,[20,20]);
subplot(1,2,1) % using subplot to plot multiple panels in one figure
imagesc(mmatgrid,[-0.1 0.05]); colormap(gray);
title('The starting model');
colorbar('SouthOutside');
axis equal
xlim([0,20]);
ylim([0, 20]);
subplot(1,2,2)
imagesc(minvertgrid,[-0.1 0.1]); colormap(gray);
title('The recovered model by inversion');
colorbar('SouthOutside');
axis equal
xlim([0,20]);
ylim([0, 20]);
Here is what I have below that code I provided previously. I tried to explain what I am doing in the green text.
Cris LaPierre
Cris LaPierre 2022 年 10 月 21 日
That doesn't help explain what you are trying to do with gmat and gdata.
What is gdata? Why are you trying to reshape it from a 3x79 array to an 118x400 array? How do you determine where each value in gdata should go in gmat?
Jacob Allen
Jacob Allen 2022 年 10 月 23 日
This code was given to me as a shell code. Im only suppose to be able to change certain things to get a different outcome. I don't know what the original intent of each piece of this code means. I just need the error to be fixed so that I can output the graphs.
Cris LaPierre
Cris LaPierre 2022 年 10 月 24 日
The error has been explained, but we don't have enough detail to tell you what it should be doing instead.

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeCreating and Concatenating Matrices についてさらに検索

製品

リリース

R2021a

タグ

質問済み:

2022 年 10 月 21 日

コメント済み:

2022 年 10 月 24 日

Community Treasure Hunt

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

Start Hunting!

Translated by