How to select columns from data matrix using "for" loop?
이 질문을 팔로우합니다.
- 팔로우하는 게시물 피드에서 업데이트를 확인할 수 있습니다.
- 정보 수신 기본 설정에 따라 이메일을 받을 수 있습니다.
오류 발생
페이지가 변경되었기 때문에 동작을 완료할 수 없습니다. 업데이트된 상태를 보려면 페이지를 다시 불러오십시오.
이전 댓글 표시
0 개 추천
Hi,
I would like to select columns from a data matrix and use them to interpolate data from another file. For example, first column is selected and interpolated from another file, and printed, then the second column, and so on. I know the interpolation code, but I need the selection of column and printing the interpolated data codes.
I would be grateful if someone can help me in this.
Thank you. Regards, Ismail
채택된 답변
Birdman
2018년 2월 14일
One approach:
for i=1:size(A,2)%number of columns
b=A(:,i);%ith column is assigned to b variable at every step
interp(b,..);%you can use it in your function
end
댓글 수: 42
Either erase the semicolon:
for i=1:size(A,2)%number of columns
b=A(:,i)
interp(b,..);
end
or use disp:
for i=1:size(A,2)%number of columns
b=A(:,i);%ith column is assigned to b variable at every step
interp(b,..);%you can use it in your function
disp(b)
end
Thanks Birdman. Would you please be able to suggest to me how to print the outcome out at every step?
Outcome, means outcome of interp? Then:
for i=1:size(A,2)%number of columns
b=A(:,i);%ith column is assigned to b variable at every step
res=interp(b,..);%you can use it in your function
disp(res)
end
I mean to print the interpolation results in a .txt file.
Answer:
for i=1:size(A,2)%number of columns
b=A(:,i);%ith column is assigned to b variable at every step
res=interp(b,..);%you can use it in your function
disp(res)
fid=fopen(['result_' num2str(i) '.txt'],'w');
fprintf(fid,'%f\n',res);
fclose(fid)
end
Thank you very much Birdman for the code. That is really helpful. Also, I am actually extracting the data matrix from a file. I am not sure how to modify the code to suit that. Thank you again Birdman for your great help.
Unless you have a different data matrix file for each column, you would read the data once before the loop, and then (if necessary) extract the appropriate portion of it inside the loop.
You will use fscanf instead of fprintf. Imagine you want to read the file you wrote. Simply do this:
fid=fopen('result_1.txt,'r');
fscanf(fid,'%f')
fclose(fid)
The line with fscanf will display the result of the txt file.
Many thanks Birdman. I tried to incorporate it in my code. I only get the interpolation in the first file. Would you please be able to check it for me?
clear; clc;
Folder = cd;
N=100;
x2 = zeros(N, 10);
for k = 1:N;
Driftt = sprintf('Drift%d.out', k);
Reactt = sprintf('React%d.out', k);
matDrift = importdata(fullfile(Folder, Driftt));
matReact = importdata(fullfile(Folder, Reactt));
x1= matDrift(:,2);
y1= -sum(matReact(:,2:11),2);
[x3, ix] = unique(x1);
y3 = y1(ix);
A=importdata('allPiers.txt');
for i=1:size(A,37)%number of columns
b=A(:,i);%ith column is assigned to b variable at every step
[y2] = [b];
x2 (k,:) = interp1(y3, x3, y2, 'linear')
fid=fopen(['result_' num2str(i) '.txt'],'w');
fprintf(fid,'%f\n',x2);
fclose(fid)
end
end
i=1:size(A,37)
The above has to change to
i=1:size(A,2)
Great. Thank you so much Birdman. The only thing is that some of the data in the .txt files are written as "NaN". Is there anyway to replace them automatically with 0.07?
Replace them before writing in your for loop. So
temp=x2(k,:);
temp(isnan(temp))=0.07;
x2(k,:)=temp;
and then write to the txt file.
Thank you Birdman. Which one exactly? I put it before the second for loop but it does not work.
Ismail Qeshta
2018년 2월 14일
편집: Ismail Qeshta
2018년 2월 14일
I actually mean the output "result_n.txt" files.
Use the following code:
clear; clc;
Folder = cd;
N=100;
x2 = zeros(N, 10);
for k = 1:N;
Driftt = sprintf('Drift%d.out', k);
Reactt = sprintf('React%d.out', k);
matDrift = importdata(fullfile(Folder, Driftt));
matReact = importdata(fullfile(Folder, Reactt));
x1= matDrift(:,2);
y1= -sum(matReact(:,2:11),2);
[x3, ix] = unique(x1);
y3 = y1(ix);
A=importdata('allPiers.txt');
for i=1:size(A,37)%number of columns
b=A(:,i);%ith column is assigned to b variable at every step
[y2] = [b];
x2 (k,:) = interp1(y3, x3, y2, 'linear')
temp=x2(k,:);
temp(isnan(temp))=0.07;
x2(k,:)=temp;
fid=fopen(['result_' num2str(i) '.txt'],'w');
fprintf(fid,'%f\n',x2);
fclose(fid)
end
end
Many thanks Birdman. Shall the for i=1:size(A,37) be changed to i=1:size(A,2)?
Oh yes, change it.
I cannot thank you enough Birdman. You have been awesome. Thank you very much.
You are welcome.
Hi Birdman. Actually, after doing some further checking of the code, I found that it does not give the same results as when I use it for individual columns using the original code below. Would you please be able to help me find the error?
clear; clc;
Folder = cd;
N=100;
x2 = zeros(N, 10);
for k = 1:N;
Driftt = sprintf('Drift%d.out', k);
Reactt = sprintf('React%d.out', k);
matDrift = importdata(fullfile(Folder, Driftt));
matReact = importdata(fullfile(Folder, Reactt));
x1= matDrift(:,2);
y1= -sum(matReact(:,2:11),2);
[x3, ix] = unique(x1);
y3 = y1(ix);
[y2] = [8479186.526 5814080.3 7648088.256 7116870.805 9233172.585];
x2 (k,:) = interp1(y3, x3, y2, 'linear')
end
x2 (k,:)
The above refers to individual rows. You need to write it as
x2 (:,k)
Ismail Qeshta
2018년 2월 14일
편집: Ismail Qeshta
2018년 2월 14일
Thanks Birdman. It showed me the following error message: Subscripted assignment dimension mismatch.
Subscripted assignment dimension mismatch.
Error in Interpolate11 (line 18)
x2 (:,k) = interp1(y3, x3, y2, 'linear')
Write this:
x2 (:,k) = interp1(y3, x3, y2, 'linear').'
Ismail Qeshta
2018년 2월 14일
편집: Ismail Qeshta
2018년 2월 14일
Thanks Birdman. I got the same error message as above. Now the code is:
clear; clc;
Folder = cd;
N=100;
x2 = zeros(N, 10);
for k = 1:N;
Driftt = sprintf('Drift%d.out', k);
Reactt = sprintf('React%d.out', k);
matDrift = importdata(fullfile(Folder, Driftt));
matReact = importdata(fullfile(Folder, Reactt));
x1= matDrift(:,2);
y1= -sum(matReact(:,2:11),2);
[x3, ix] = unique(x1);
y3 = y1(ix);
A=importdata('AllPiers2.txt');
for i=1:size(A,2)%number of columns
b=A(:,i);%ith column is assigned to b variable at every step
[y2] = [b];
x2 (:,k) = interp1(y3, x3, y2, 'linear').'
temp=x2(:,k);
temp(isnan(temp))=0.07;
x2(:,k)=temp;
fid=fopen(['result_' num2str(i) '.txt'],'w');
fprintf(fid,'%f\n',x2);
fclose(fid)
end
end
What does the output of
interp1(y3, x3, y2, 'linear')
look like?
This interpolation is for getting the y values that correspond to x values from the data matrix column. It refers to the linear interpolation.
What is the size(dimensions) of it?
I don't know, but the output of x2 is 10 X 100.
clear; clc;
Folder = cd;
N=100;
x2 = zeros(N, 10);
for k = 1:N;
Driftt = sprintf('Drift%d.out', k);
Reactt = sprintf('React%d.out', k);
matDrift = importdata(fullfile(Folder, Driftt));
matReact = importdata(fullfile(Folder, Reactt));
x1= matDrift(:,2);
y1= -sum(matReact(:,2:11),2);
[x3, ix] = unique(x1);
y3 = y1(ix);
A=importdata('AllPiers2.txt');
for i=1:size(A,2)%number of columns
b=A(:,i);%ith column is assigned to b variable at every step
[y2] = [b];
res = interp1(y3, x3, y2, 'linear').'
x2=res(:,k);
temp=x2;
temp(isnan(temp))=0.07;
x2=temp;
fid=fopen(['result_' num2str(i) '.txt'],'w');
fprintf(fid,'%f\n',x2);
fclose(fid)
end
end
Many thanks Birdman. I got the following error message:
Index exceeds matrix dimensions.
Error in Interpolate11 (line 19)
x2=res(:,k);
Ups, I missed this. Adapt this code:
clear; clc;
Folder = cd;
N=100;
x2 = zeros(N, 10);
for k = 1:N;
Driftt = sprintf('Drift%d.out', k);
Reactt = sprintf('React%d.out', k);
matDrift = importdata(fullfile(Folder, Driftt));
matReact = importdata(fullfile(Folder, Reactt));
x1= matDrift(:,2);
y1= -sum(matReact(:,2:11),2);
[x3, ix] = unique(x1);
y3 = y1(ix);
[y2] = [8479186.526 5814080.3 7648088.256 7116870.805 9233172.585].';
x2 (k,:) = interp1(y3, x3, y2, 'linear')
end
Ismail Qeshta
2018년 2월 14일
편집: Ismail Qeshta
2018년 2월 14일
Many thanks Birdman. In which part of the code should it be placed? This code is for individual data not the one we discussed above I think.
clear; clc;
Folder = cd;
N=100;
x2 = zeros(N, 10);
for k = 1:N;
Driftt = sprintf('Drift%d.out', k);
Reactt = sprintf('React%d.out', k);
matDrift = importdata(fullfile(Folder, Driftt));
matReact = importdata(fullfile(Folder, Reactt));
x1= matDrift(:,2);
y1= -sum(matReact(:,2:11),2);
[x3, ix] = unique(x1);
y3 = y1(ix);
A=importdata('AllPiers2.txt');
for i=1:size(A,2)%number of columns
b=A(:,i);%ith column is assigned to b variable at every step
[y2] = [8479186.526 5814080.3 7648088.256 7116870.805 9233172.585].';
x2 (:,k) = interp1(y3, x3, y2, 'linear').'
temp=x2(:,k);
temp(isnan(temp))=0.07;
x2(:,k)=temp;
fid=fopen(['result_' num2str(i) '.txt'],'w');
fprintf(fid,'%f\n',x2);
fclose(fid)
end
end
Thanks Birdman. [y2] should take [b] values not the one inserted. Isn't it?
I still got the same error message:
Subscripted assignment dimension mismatch.
Error in Interpolate11 (line 18)
x2 (:,k) = interp1(y3, x3, y2, 'linear').'
Make sure that this y2 vector you defined manually has the same length with
b=A(:,i);
y2=b;
because that was working as I recall. Notice the lengths should be equal.
It was actually working, but the results were unfortunately different.
The matrix dimension problem came up only when we started changing the x2(:,k) with x2(k,:)
Then keep the initial order. :)
Thanks Birdman. Yes, that is right, but how to fix the difference in results?
Maybe that should be another question in forum, right?
Yes. I was thinking about that. Thank you very much again Birdman. I really appreciate your time and effort.
You are welcome.
추가 답변 (0개)
카테고리
도움말 센터 및 File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
